一、异常类结构
说明:
- 1.Throwable类:实现了Serializable接口,是所有Exception和Error的父类。
- 2.Exception和Error:异常可以被捕获处理,可以被JVM抛出或者是用throws抛出;错误不可以被捕获。
- 3.Checked Exceptions:检查时异常,可以被检查到的异常,必须强制用try...catch捕获处理或用throws抛出,Exception的子类(不包括RuntimeException)都是检查时异常,比如IOException,ClassNotFindException。
- 4.Unchecked Exceptions:非检查时异常,不可以被检查出来,会由JVM抛出,包括所有Error和RuntimeException异常,比如NullPointerException。
二、处理异常的方法
积极处理
使用try...catch捕获并手动处理异常。异常出现处后面的代码也可以执行。
try{
//可以出现异常的语句
}catch (异常类型){
//对异常进行处理
}
注意:当使用多个catch捕获多个异常时,子类异常要写在父类异常的前面。
消极处理
声明方法时抛出(throws)异常,没有对其进行处理。
这种处理是将方法中出现的异常,一层一层向上抛,当前方法抛给调用当前方法的方法,最后抛给main方法,也就是交给JVM来处理,当JVM处理异常后,程序结束,异常后面的代码不会被执行。
以上,异常处理还是使用try...catch,这样即使出现异常也可以保证程序能够运行完毕。
que:throws和throw?
throws表示将异常交给方法的调用处处理,throw表示手动抛出一个异常对象,比如throw new Exception():
public class TestThrow {
public static void main(String args[]) {
try {
throw new Exception("抛着玩的。");
} catch (Exception e) {
e.printStackTrace();
}
}
}
三、finally语句
try...catch...finally:
如果出现异常并捕获,finally中的语句会执行,finally之后的语句也会执行。
如果在catch中return,finally中的语句会执行,但是finally语句之后的内容不会执行。如以下代码:
public class TestFinally {
public static void test() {
String str = "123a";
try {
Integer.parseInt(str);
} catch (Exception e) {
e.printStackTrace();
System.out.println("出现异常");
return;
} finally {
System.out.println("finally 语句");
}
//catch中return,finally之后的内容不会执行
System.out.println("The end");
}
public static void main(String[] args) {
test();
}
}
输出结果:
综上,finally保证了不管在什么情况下,finally语句块的内容都会执行。