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

 

posted on 2016-02-27 01:29  了明  阅读(1734)  评论(0编辑  收藏  举报

导航