Java异常与捕获:
一、引入异常的目的:
为了保证程序在出现异常之后可以正常的执行完毕,就需要进行异常处理。
二、异常类的继承结构:
三、详解异常类:
(1)由图可知,所有的异常类都是继承于Throwable类的;
(2)Error类:
描述的是java运行时内部错误和资源耗尽错误,应用程序不会抛出此类异常,这种错误一旦出现,除了告知用户并且使程序安全终止以外,再无能为力,这种情况也很少见。
(3)Exception类:
- 有两个子类:IOException、RuntimeException;
- 由于程序错误导致的异常属于RuntimeException;
- 如果程序本身没有任何问题,但是由于I/O错误导致的问题属于IOException;
(4)分类:
- 非受查异常:派生于Error类与RuntimeException类。
- 受查异常: 除了非受查异常,其他都是受查异常。
[注意]:
受查异常必须进行处理,可以通过try……catch……或者通过throws直接将异常扔回;
非受查异常则用户不处理也可以;
(5)异常产生的影响:
异常是导致程序中断执行的一种指令流,程序之中如果出现了异常而没有合理处理就会导致程序终止执行。
[注意]:
在程序执行的过程中,如果产生了异常,那么在异常产生之前的语句是可以正常执行的,直到遇到了异常,才直接退出终止程序。
(6)异常处理格式:
try{
有可能产生异常的语句;
}catch(异常类 对象){
……;
}finally{
异常的出口;
}
——[异常处理的三种组合格式]:
- try……catch;
- try……finally;
- try……catch……finally;
(7)throws关键字:
用于方法上,明确表示本方法可能产生异常,并且不处理,返回给调用方处理。
public class test{
public static void main(String[] args) throws Exception{
//依旧会产生错误,继续将异常扔回给调用处:JVM(主方法的调用者)
System.out.println(div(10,0));
System.out.println("div方法结束");
}
//可能会产生异常,将异常扔回给调用处:主方法
public static int div(int x, int y) throws Exception{
return x/y;
}
}
[注意]:
当采用上面的方法,也就是利用throws关键字进行异常的处理将异常最终扔回给了JVM,主方法中异常产生后面的语句(System.out.println(“div方法结束”);)将不再执行。
但是如果在主方法中采用try……catch……finally进行异常的处理,都将执行finally块中的语句。
在主方法上使用throws抛出异常后,交由JVM处理;
(8)throw关键字:
用于方法中,异常对象是由用户产生的,而不是由JVM产生的,一般与自定义异常类搭配使用。
[问题]:
throws和throw有什么区别?
throw用于方法内部,主要表示手工的异常抛出;
throws用于方法声明上,明确告诉用户该方法可能会产生异常但是不进行处理;
四、RuntimeException类:
[注意]:
- NumberFormatException(数值转换异常)属于RuntimeException;
- RuntimeException是非受查异常,没有进行强制性要求处理异常;
[问题]:
解释Exception与RuntimeException的区别:
- Exception是RuntimeException的父类,Exception是受查异常,也就是在出现异常之后强制要求处理该异常;
- RuntimeException是非受查异常,有用户选择处理与不处理;
[问题]:
常见的RuntimeException有哪些?
- ClassCastException;
- NullPointerException;
- NumberFormatException;
五、断言assert:
(1)assert的语法:
assert 布尔表达式:“返回false执行的饿代码块”
[解释]:
- 当布尔表达式为真时,程序继续执行,当为假时,走布尔表达式后面的代码;
- 当断言返回false时,会抛出断言异常;
[注意]:
- 在Java中,断言需要开启,默认状态是关闭的;
- 如果想让断言起作用,必须给JVM传参数-ea来启用断言;
(2)断言assert的实例:
public class test{
public static void main(String[] args) {
int num = 20;
assert num == 55:"错误:num应该为55";
System.out.println(num);
}
}
观察输出结果可以发现,断言的异常是Error类异常(非受查异常),在遇到异常产生处时,就会直接结束程序,不在继续执行了。 进行如下修改,就可以继续执行下去了。
public class test{
public static void main(String[] args) {
int num = 20;
try{
assert num == 55:"错误:num应该为55";
}catch(Throwable e){
e.printStackTrace();
}
System.out.println(num);
}
}
通过上面的输出结果可以看出,在遇到异常之后,程序依旧执行了后续语句。