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(); } }