异常是指java程序运行时(非编译)所发生的非正常情况或错误,java把程序发生的每个异常都封装到了一个对象来表示,所有异常的根类为java.lang.Throwable,Throwable有两个直接已知的子类:Error和Exception,Error是程序本省无法克服和恢复的严重问题,例如:内存溢出和线程死锁等系统问题。Exception是程序能够克服和恢复的问题,它又分为系统异常(unchecked异常)和普通异常(checked异常),系统异常可以处理也可以不做处理,针对普通异常编译器强制要求必须用try_catch语句块包裹或throws声明抛出异常,下面说一下针对普通异常里面语句块的执行顺序问题。
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class TestOrder {
public static void main(String[] args) {
System.out.println(exeOrder());
}
public static String exeOrder() {
FileReader reader = null;
try {
System.out.println("aaa");
reader = new FileReader("d:/a.txt");
char c = (char) reader.read();
System.out.println("bbb");
return "try语句块";
} catch (FileNotFoundException e) {
e.printStackTrace();
return "第一个catch语句块";
} catch (IOException e) {
e.printStackTrace();
return "第二个catch语句块";
} finally {
System.out.println("finally块");
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
// return "finally语句块";
}
}
}
针对上面的程序,如果我的D盘中有一个a.txt的文本,程序执行结果为:
aaa
bbb
finally块
try语句块
如果里面传入了一个不存在的文本,例如abc.txt,那么程序执行的结果为:
aaa
java.io.FileNotFoundException: d:\abc.txt (系统找不到指定的文件。)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:106)
at java.io.FileInputStream.<init>(FileInputStream.java:66)
at java.io.FileReader.<init>(FileReader.java:41)
at cn.sxt.exception.TestOrder.exeOrder(TestOrder.java:16)
at cn.sxt.exception.TestOrder.main(TestOrder.java:9)
finally块
第一个catch语句块
从上面的执行结果可以看出:
1.程序先执行try_catch语句块,给返回值赋值
2.执行finally
3.执行try或catch里面的return语句
这里要说明一下,一般情况下,finally语句块里面就写一些关闭资源的代码,不要写return语句,因为一旦finally语句块中有return语句,它就会覆盖try_catch语句块中的return语句。
注意:catch语句块要把父类异常放下面,子类异常放上面,如果次序颠倒,下面的catch语句块将永远也执行不到。