Java异常机制 学习笔记
什么是异常?
异常,不正常也。Exception是Exception event的缩写,因此异常是一个事件,该事件发生在程序运行时。
异常会影响程序的连续性,使程序中断。在Java中,一切皆对象,所以要定义异常,也需要使用对象。异常对象里
封装了异常类型和程序发生异常时的状态。
我们经常说的抛出异常就是创建异常对象,并提交给运行系统。
异常捕获机制与try-catch
当异常发生时,我们需要知道异常在哪里发生的,那么怎么定位异常的出处呢?
在Java中,使用call stack来记录方法调用顺序。当Java程序发生异常时,会搜索call stack,希望找到特定
的代码块来处理它。就像生病(Exception)了,我们会去医院找特定科目的医生就诊。以下图为例,main方法
调用method0,同理method0调用method1,等等。

在Java中异常处理,使用try-catch语句。语法为:
try {
// 可能出现异常的代码
} catch (ExceptionType name) {
// 异常处理代码
} catch (ExceptionType name) {
// 异常处理代码
}
结合上图我们实现一个异常处理示例程序:
public static void main(String[] args) {
method0();
}
static void method0(){
// 异常处理:try-catch
try{
method1();
} catch(ArrayIndexOutOfBoundsException e){
e.printStackTrace();
} // try-catch块结束
}
static void method1(){
method2();
}
static void method2(){
int[] arr = new int[3];
// 异常发生源头
// 数组越界情况
arr[4] = 6;
}
method2中发生数组越界,但是没有异常处理代码,所以就去上一级方法中找处理代码,如上图所示。
这个找的过程正好和方法调用顺序相反,找呀找,终于在method0中找到try-catch代码块,终于有得“治”了,哈哈。
try-catch捕获发生的异常:相当于在那里守着,一旦发现问题就采取措施。而寻找异常源的任务就交给Java虚拟机去
做就好了,是不是很方便呢^_^
finally块
试想,如果我们想在抛出异常后干点什么。比如,对一个文件进行读写,出现异常,抛异常之后程序退出来了,而文件没有关闭,这样会导致文件暴露在什么事情都可能发生的运行环境中,就可能会引起内容被修改;另一个情况是,文件一致被打开着,内存被无情地占用着,无法脱身,也是不好的。
finally诞生了!定义:fially块在try块退出的时候执行,就是说无论抛不抛异常,try执行完后,执行return之前执行finally块。
public static void main(String[] args) throws IOException{
try{
FileWriter writer = new FileWriter(new File("test.txt"));
writer.write(1);
} catch(IOException e}{
throw e;
} finally{ // try之后,return之前
writer.close();
}
}
浙公网安备 33010602011771号