学习笔记-马士兵java-异常处理

1. 异常(Exception)的概念:

  a. JAVA异常是JAVA提供的用于处理程序中错误的一种机制。

  b. 所谓错误时指在程序运行的过程中发生的一些异常事件(如:除0溢出,数组小标越界,读取的文件不存在等)。

  c. 设计良好的程序,应该在异常发生时提供处理这些错误的方法,使得程序不会因为异常的发生而阻断或产生不可预见的结果。

  d. JAVA程序的执行过程中如出现异常事件,可以生成一个异常对象,该异常对象封装了异常事件的信息并被提交给JAVA运行时系统,这个过程称为抛出(throw)异常

  e. 当JAVA运行时系统接受到异常对象时,会寻找能处理这一异常的代码,并把当前异常对象交给其处理,这一过程称为捕获(catch)异常

补充说明:catch 不可以单独使用,必须和 try 联合使用。

补充说明:C 和 C++ 不检查数组下标是否越界。(IIS缓冲区溢出漏洞:即数组下标越界)

2. 使用 e.printStackTrace();   打印堆栈信息:从错误源头到每个导致出现的错误都打印出来。

3. 异常的分类:

  a. Throwable(可以被抛出的东西,所有异常类的根基类)

    ① Error(系统的内部错误,无法处理)

      Ⅰ……

    ② Exception(可以处理的异常)

      Ⅰ RuntimeException(运行时异常,经常出的错误,可以不catch)

        ① ……(常见异常,数组下标越界、空指针、除0等等)

      Ⅱ……(除RuntimeException的其他Exception,必须 try...catch...

4. 异常的分类:

  a. Error:称为错误,由JAVA虚拟机生成并抛出,包括动态链接失败、虚拟机错误等,程序对其不做处理。

  b. Exception:所有异常类的父类,其子类对应了各种各样可能出现的异常事件,一般需要用户显示地声明或捕获。

  c. Runtime Exception:一类特殊的异常,如被0除、数组下标越界等,其产生比较频繁,处理麻烦,如果显示的声明或捕获将会对程序可读性和运行效率影响很大。因此由系统自动检测并将它们交给缺省的异常处理程序(用户可不必对其处理)。

5. 异常的捕获和处理:

  try {

    //可能抛出异常的语句

  } catch(someException1 e) {

    //处理办法

  } catch(someException2 e) {

    //处理办法

  } finally {

    ……

  }

说明:

  a. try 代码段包含可能产生例外(异常)的代码。

  b. try 代码段后跟有一个或多个 catch 代码段。 

  c. 每个 catch 代码段声明其能处理的一种特定类型的异常并提供处理方法。

  d. 当异常发生时,程序会终止当前的流程,根据获取异常的类型区执行相应的 catch 代码段。

  e. finally 段的代码无论是否发生异常都会执行(用于关闭报错后为来的及关闭的文件等)

6. 异常的捕获和处理:

  a. try 语句

    ① try{……} 语句制定了一段代码,该代码就是一次捕获并处理例外的范围。

    ② 在执行过程中,该段代码可能会产生并抛出一种或几种类型的异常对象,它后面的 catch 语句要分别对这些异常做相应的处理。

    ③ 如果没有例外产生,所有的catch代码段都被略过不执行。

  b. catch 语句

    ① 在 catch 语句块中是对异常进行处理的代码,每个try语句块可以伴随一个或多个 catch 语句,用于处理可能产生的不同类型的异常对象。

    ② 在 catch 中声明的异常对象(catch(SomeException e))封装了异常事件发生的信息,在 catch 语句块中可以使用这个对象的一些方法获取这些信息。

    ③ 例如:

      ⅠgetMessage() 方法:用来得到有关异常事件的信息。

      ⅡprintStackTrace() 方法:用来跟踪异常事件发生时执行堆栈的内容(程序员常用)。

  c. finally 语句

    ① finally 语句为异常处理提供一个统一的出口,使得在控制流程转到程序的其他部分以前,能够对程序的状态作统一的管理。

    ② 无论 try 所指定的程序块中是否抛出例外,finally 所指定的代码都要被执行。

    ③ 通常在 finally 语句中可以进行资源的清理工作,如:

      Ⅰ关闭打开的文件

      Ⅱ删除临时文件

      Ⅲ ……

  d. throws 语句(此方法会抛出什么异常):

    ① 抛出异常(throws SomeException)

    ② 帮助文档(两种):

      Ⅰ:直接在方法后面定义的。

      Ⅱ:(方法说明中提示throws的)说明方法里会抛出某种异常。

  e. throw 语句(在方法内如何实际抛出异常):

    ①  在方法中,throw new SomeException("异常说明");  //new一个构造方法(可查API文档)

7. 声明方法抛出的异常:

  readFile() throws IOException{...}       // 向下(上一级)抛出

  method1() throws IOEception{ readFile() }   // 向下(上一级)抛出

  method2() throws IOException{ method1() }  // 向下(上一级)抛出

  public static main (String s) {    //main方法也可以抛出异常,将异常交给运行时系统,打印堆栈信息。

    try{ method2() } catch(IOException e) {...}

  }

补充说明:JAVA的例外处理机制使得例外事件,沿着被调用的顺序往前需找,直到找到符合该例外种类的例外处理程序。

8. catch 的先后顺序:如果多个 catch 有父类与子类,则先catch子类,后catch父类,否则报错。

9. 使用自定义的异常一般步骤:

  a. 通过继承 java.lang.Exception类 声明自己的异常类。

  b. 在方法适当的位置生成自定义异常的实例,并用 throw 语句抛出。

  c. 在方法的声明部分用 throws 语句声明该方法可能抛出的异常。

(不是最好的设计,更好的在以后项目中讲解):

  class MyException extends Exception {

    private int id;

    public MyException(String message, int id) {

      super(message);

      this.id = id;  //C语言遗留下的,不是很好的设计,以后项目讲解更好的设计

    }

    public int getId() {

      retun id;

    }

  }

10. 异常和继承的关系: 重写方法需要抛出与原方法所抛出异常类型一致(子类与父类均不行,多了也不行)的异常或不抛出异常

 

补充说明:虽然 main 方法也可抛出异常(给运行时系统),但实际项目不建议使用。

补充说明:建议 catch 更详细(有子类不用父类)的异常类,以区分不同异常的不同处理。

补充说明:捕获异常同时,及时处理(处理代码不能为空,不然此异常则石沉大海)。

posted @ 2013-10-13 17:01  被盗的小偷  阅读(110)  评论(0)    收藏  举报