• 1. 异常处理(下)
  • 2. 本节注意内容抛出异常 捕获异常和抛出异常的结合使用 方法覆盖时的异常处理 自定义异常 printStackTrace()方法
  • 3. 抛出异常在定义一个方法的时候,如果并不能确定如何处理其中可能出现的异常或者捕获的异常自己没有能力处理,可以不在方法中对异常进行处理,可以将异常抛出, 将可能发生的异常让这个方法的调用者来处理 可以对下列情形在方法定义中抛出异常: 方法中调用了一个会抛出“已检查异常”的方法 程序运行过程中发生了错误,并且用throw子句抛出了一个“已检查异常” 不要抛出如下异常: 从Error中派生的那些异常 从RuntimeException中派生的那些异常,如NullPointerException等
  • 4. Java异常调用栈机制如果一个异常没有在当前的try-catch模块中得到处理,则它会抛出到它的调用方法。 如果一个异常回到了main()方法,仍没有得到处理,则程序会异常终止。
  • 5. throws方法中抛出异常的格式 methodName([]) throws { //…… }
  • 6. throws例子 … … public void readFile() throws FileNotFoundException,IOException { FileInputStream fis = new FileInputStream("c:/a.txt"); int b; b = fis.read(); while(b!= -1) { System.out.print((char)b); b = fis.read(); } fis.close(); } … …. 代码参见案例:13-7 throws的例子
  • 7. throw例子 … … public void readFile() throws FileNotFoundException,IOException{ File f = new File("c:/a.txt"); if (!f.exists()){ // 抛出已检查异常 throw new FileNotFoundException("File can't be found!"); } FileInputStream fis = new FileInputStream(f); int b; b = fis.read(); while(b!= -1){ System.out.print((char)b); b = fis.read(); } fis.close(); } … … 代码参见案例: 3-18 throw的例子
  • 8. thorw使用规则程序员可以控制异常抛出的时机,在认为有异常发生的时候,可以通过throw 手动的抛出异常 throw关键字抛出的对象,必须是Throwable类型的对象 找到一个合适的异常类 实例化这个异常类的实例 抛出这个异常的对象
  • 9. 捕获和抛出结合使用捕获异常和抛出异常的方式,并不是排它的,它们可以结合起来使用: method() throws XXXException{ … try{…} catch(XXXException e){ … throw e; } }
  • 10. 方法覆盖中的异常当子类中的方法覆盖父类中的方法时,可以抛出异常 覆盖方法抛出的异常,可以抛出与被覆盖方法的相同的异常或者被覆盖方法的异常的子类异常. 在子类中的覆盖方法中不能抛出父类的被覆盖方法抛出异常类的父类,即异常不能扩大 如果父类的方法中没有抛出异常,子类中也不能抛出任何异常 代码参见案例:13-9 方法覆盖中的异常
  • 11. 自定义异常类可以通过继承Exception或它的子类来实现自己的异常类 一般而言,对于自定义的异常类,会设计两个构造器:一个默认的不带参数的构造器以及一个带参数的构造器,后者用于传递详细的出错信息。
  • 12. 自定义异常类例子(示例8-9)public class UserException extends Exception { public UserException() { super(); } public UserException(String msg) { super(msg); } public String toString() { return "发生了除数为0的异常"; } } 代码参见案例:13-10 用户定义异常
  • 13. 自定义异常类(con.)public static double divide(int a, int b) { double c = 0.0; try { if (b == 0) { throw new UserException("发生了除数为0的异常"); } c = (double) a / b; } catch (UserException ue) { System.out.println(ue); //ue.printStackTrace(); } return c; }
  • 14. Exception的printStackTrace()方法利用Exception的printStackTrace()方法可以追踪异常出现的执行堆栈情况 代码参见案例:13-11 追踪异常的源头 虽然printStackTrace()方法可以显示异常出现的位置,可以用来调试程序.但是在最后发布程序的时候,应该尽量避免使用,而应该对捕获的异常进行适当的处理.而不是简单的将异常的堆栈信息打印出来
  • 15. Java异常处理机制的优点把各种不同的异常情况进行分类,用Java类来标识异常情况,这种类被称为异常类.把异常封装成异常类,可以充分的发挥了的扩展和可重用的优势 异常流程和代码的正常流程代码分离,提高了程序的可读性,简化了程序的结构 可以灵活的处理异常.如果当前方法由能力处理异常,就捕获并处理它.如果捕获到的异常自己没有能力处理,就可以继续抛出异常,由方法的调用者来处理该异常
  • 16. 小结定义异常 使用try, catch和finally 描述异常的种类 辨认常出现的异常 开发程序处理自定义的异常