Java异常类及处理
异常概述:运行时发生的不正常情况
在java中用类的形式对不正常的情况进行了描述和封装对象。
描述不正常的类,称之为异常类。
异常就是java通过面向对象的思想将问题封装成了对象,用异常类对其进行描述。
不同的问题用不同的类进行具体的描述,比如角标越界,空指针等。
异常体系两大类:
无论是error,还是Exception,问题发生就应该可以抛出,让调用者知道并处理,该体系的特点就在于Throwable及其所有子类都具备可抛性。
Throwable:
① 一般不可处理的。Error 特点:是由JVM抛出的严重性问题;这种问题一般不针对处理,直接修改程序。 ② 可处理的。Exception 可抛性:被throws 和 throw 关键字所操作的类和对象都具备可抛性 该体系的特点:子类的后缀名都是用其父类名作为后缀名,阅读性很强。
异常分类:
检测性异常:即除RuntimeException及其子类以外的异常。这类异常在编译时就进行检测,不处理不能通过; 非检测性异常:即运运行时异常RuntimeException及其子类。这类异常不处理变异也可以通过,如果有抛出 直接抛到控制台让调用者进行修正;
自定义异常:
要么继承 Exception 要么继承 RuntimeException
如果抛出一个在Java中没有定义过的异常,这时就需要自定义创建一个异常类。
注:自定义一个异常类,必须要继承一个异常体系才可以被抛出,被throw throws所操作
异常抛出注意事项:
子类覆盖父类只能抛出父类的异常或者子类或者子集
① 子类在覆盖父类方法时,父类方法如果抛出了异常,那么子类的方法只能抛出父类异常或者该父类异常的子类; ② 如果父类抛出多个异常,那么子类只能抛出父类异常的子集
注意:如果父类的方法没有抛出,那么子类覆盖式也决不能抛出,只能try
异常处理:throw,throws和try...catch;finally;
用类封装描述异常(称为异常类),不同的问题不同的类,当程序中遇到可能会发生异常的时候抛出异常类或进行捕获异常处理。
异常抛出
throw 和 throws 的区别:
① throw:使用在函数内,throw抛出的是异常对象;throw new 异常类 ( )
② throws:使用在函数上,throws抛出的是异常类,可抛出多个,用逗号隔开( , );throws 类名,...,...,
PS:当 throw new RuntimeException的时候,不用throws
throw:
抛出一个异常,一般是在函数代码块的内部,当程序出现某种逻辑错误时由程序员主动抛出某种特定类型的异常
public void getOffer(String s) {
if(s.equals("abc")) {
throw new NumberFormatException();
}
if(s.equals("")) {
throw new Exception("输入参 S 不能为空");
} else {
System.out.println(s);
}
}
throws:
可能抛出异常的声明 (用在声明方法时,表示该方法可能要抛出异常)
当某个方法可能会抛出某种异常时用于throws 声明可能抛出的异常,然后交给上层调用它的方法程序处理
public class testThrows(){
public static void function() throws NumberFormatException{
String s = "abc";
System.out.println(Double.parseDouble(s));
}
public static void main(String[] args) {
try {
function();
} catch (NumberFormatException e) {
System.err.println("非数据类型不能强制类型转换。");
}
}
异常捕捉
捕获异常:try...catch 关键字捕获异常 tay...catch放在异常可能会发生的地方
try
{
//需要被检测异常的代码(保护代码块)
}catch(异常类 引用名)//该类用于接收发生的异常对象
{
//处理异常的代码(异常类)
}catch(异常类 引用名)
{ //可多重捕获,可在try语句后面添加任意数量的catch块.
/* 如果保护代码中发生异常,异常抛给第一个catch块,异常相匹配的话,则在这里被捕获。如果不匹配,
就会传给第二个catch块,如此直到异常被捕获或通过所有catch块为止 */
//一个try块下的多个catch异常类型有父子关系,应该将子类异常放在前面,父类异常放在后面,这样保证每个catch块都有存在的意义
}
finally //通常用于关闭(释放)资源
{
//finally代码块里面的动作必定会执行,无论有没有发现捕获异常,都一定会执行的代码
//一个try至少要有一个catch块,否则, 至少要有1个finally块。但是finally不是用来处理异常的,finally不会捕获异常。
//finally主要做一些清理工作,如流的关闭,数据库连接的关闭等。
}
try catch finally 代码块组合特点:
① try catch finally ② try catch(多个)当没必要资源需要释放时,可以不用定义finally ③ try finally 异常无法直接catch处理,但是资源需要关闭
捕获处理原则:
在写程序时,对可能会出现异常的部分通常要用try{...}catch{...}去捕捉它并对它进行处理;
用try{...}catch{...}捕捉了异常之后一定要对在catch{...}中对其进行处理,那怕是最简单的一句输出语句,或栈输入e.printStackTrace();
try对应多个catch时,如果有父类的catch语句块,一定要放在下面。
如果是捕捉IO输入输出流中的异常,一定要在try{...}catch{...}后加finally{...}把输入输出流关闭;
如果在函数体内用throw抛出了某种异常,最好要在函数名中加throws抛异常声明,然后交给调用它的上层函数进行处理
异常处理原则:
① 函数内部如果抛出需要检测的异常,那么函数上必须要声明。否则必须要在函数内使用try...catch捕捉,否则编译失败;
( RuntimeException以外的异常需要throws声明 )
② 如果调用到了声明异常的函数,要么ctry catch要么throws,否则编译失败。 ③ 功能内容可以解决是用catch;解决不了用throws告诉调用者,由调用者解决。 ④ 一个功能如果抛出了多个异常,调用时必须有多个catch进行针对性处理。内部有几个需要检测的异常,就抛几个异常,抛出几个就catch几个;
Java异常类及处理的更多相关文章
- 面试准备(三) Java 异常类层次结构
在Java中,异常分为受检查的异常,与运行时异常. 两者都在异常类层次结构中.这类容易出选择题 考试你是否掌握了异常类并清楚哪些异常类必须捕获 下面的图展示了Java异常类的继承关系. 图1 粉红色的 ...
- Java 异常类层次结构
在Java中,异常分为受检查的异常,与运行时异常. 两者都在异常类层次结构中. 下面的图展示了Java异常类的继承关系. 图1 粉红色的是受检查的异常(checked exceptions),其必须被 ...
- java——异常类、异常捕获、finally、异常抛出、自定义异常
编译错误:由于编写程序不符合程序的语法规定而导致的语法问题. 运行错误:能够顺利的编译通过,但是在程序运行过程中产生的错误. java异常类都是由Throwable类派生而来的,派生出来的两个分支分别 ...
- java异常类
package shb.java.exception; /** * 测试异常类 * @Package:shb.java.exception * @Description: * @author shao ...
- Java异常类(Throwable)
一.异常类体系 二.异常类由来与定义 [异常类的由来]:Java把程序在运行时出现的各种不正常情况也看成了对象, 提取属性和行为进行描述,比如异常名称,异常信息,异常发生位置,从而形成了各种异常类 [ ...
- Java异常类复习总结
个人理解先行: 异常类是当在程序出现问题时抛出的一个警告.提示你程序设计或者代码有存在错误的地方. 异常类和Error都继承自Throwable, Throwable继承自Object类. Runti ...
- 课堂动手动脑验证以及自定义异常类实现对异常处理——java异常类
异常(exception):发生在程序执行期间,表明出现了一个非法运行的情况.许多JDK中的方法在检测到非法情况时,都会抛出一个异常对象.例如:数组越界和被0除. 代码验证: package test ...
- java -> 异常类与自定义异常
异常 什么是异常?Java代码在运行时期发生的问题就是异常. 在Java中,把异常信息封装成了一个类.当出现了问题时,就会创建异常类对象并抛出异常相关的信息(如异常出现的位置.原因等). 异常的继承体 ...
- java异常类的妙用
异常类的妙用 以往在使用异常时,只是知道通过异常类的构造方法设置一些出错信息,此外最多就是把引起该异常的原因通过Throwable类的子类一同设置进去.今天在分析springSecurity3.0 ...
随机推荐
- python pandas 使用列表快速创建数据 用于测试
创建数据和行append数据 >>> df = pd.DataFrame([['AA', 1.00], ['Ks', 2.00]], columns=['name', 'age']) ...
- Tomcat运行错误示例二
Tomcat运行错误示例二 当遇到这种错误时,一般是构建路径的问题,按步骤来就好.如图: 点击---->库---->Add Library---->下一步---->选择tomc ...
- 浅谈HP-Socket在物联网的应用
原文链接:https://my.oschina.net/chrisforbt/blog/1669746 一.应用背景 去年公司成立了个项目——<智慧用电安全隐患监管服务平台>,计划是开发一 ...
- Valgrind学习
Valgrind与其他DBI(Pin, DynamoRIO)的区别 我们需要了解DBI的几个 D&R Disassemble-and-Resynthesise 反汇编后重新组装 Valgrin ...
- linux top监控的使用
b : toggle highlight x : toggle sort row highlight shift + < > : switch sort row
- Java各版本的含义
JavaSE(Java Standard Edition):标准版,定位在个人计算机上的应用.这个版本是Java平台的核心,它提供了非常丰富的API来开发一般个人计算机上的应用程序,包括用户界面接口A ...
- Spring Boot跨域问题解决方案
@Configurationpublic class CorsConfig { @Bean public FilterRegistrationBean corsFilter() { UrlBasedC ...
- 这是<一起找打的约定>的改良版本
-- CREATE TABLE class ( -- cid INT(25)auto_increment PRIMARY KEY, -- caption VARCHAR(50) not NULL -- ...
- 大型站点图片server架构的演进
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/dinglang_2009/article/details/31450731 在主流的Web站点中,图 ...
- (数据科学学习手札61)xpath进阶用法
一.简介 xpath作为对网页.对xml文件进行定位的工具,速度快,语法简洁明了,在网络爬虫解析内容的过程中起到很大的作用,除了xpath的基础用法之外(可参考我之前写的(数据科学学习手札50)基于P ...