• 异常类的继承体系

  try块后可以有多个catch块,当系统发生不同的意外情况时,系统会生成不同的异常对象,Java运行时就会根据该异常对象所属的异常类来决定使用哪个catch块来处理该异常。

  在通常情况下,如果try块被执行一次,则try块后只有一个catch块会被执行,绝不可能有多个catch块被执行。除非在循环中使用了continue开始下一次循环,下一次循环又重新运行了try块,这才可能导致多个catch块被执行。

  try...catch后的花括号不可以省略。try块里声明的变量是代码快内局部变量,只在try块内有效,在catch块中不能访问该变量。

  在进行异常捕获时,所有父类异常的catch块都应该排在子类异常catch块的后面,先处理小异常,再处理大异常,否则将出现编译错误。

 

  • 多异常捕获

  Java7后,一个catch块可以捕获多种类型的异常。捕获多种类型的异常时,多种异常类型之间用竖线 | 隔开。且异常变量有隐式的final修饰,程序不能对异常变量重新赋值。  

public class MultiExceptionDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            int a = Integer.parseInt(args[0]);
            int b = Integer.parseInt(args[1]);
            int c = a / b;
            System.out.println("output : " + c);
        } catch (IndexOutOfBoundsException|NumberFormatException|ArithmeticException ie) {
            System.out.println("IndexOutOfBoundsException");
        } catch (Exception e) {
            System.out.println("Exception");
        }
        
        System.out.println("end");
    }

}
  • Finally

  除非在try块/catch块中调用了退出虚拟机的方法System.exit(1),否则不管在try块catch块中执行怎样的代码,出现怎样的情况,异常处理的finally块总会被执行。

  在通常情况下,不要在finally块中使用return或throw等导致方法终止的语句,一旦在finally中使用了return或throw语句,将会导致try/catch中的return和throw语句失效。

public class FinallyFlowDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        boolean a = test();
        System.out.println(a);
    }
    
    public static boolean test() {
        try {
            return true;
        } finally {
            return false;
        }
    }

}

当Java执行try和catch块时遇到了return或throw语句,这两个语句都回导致该方法立即结束,但是系统执行这两个语句并不会结束该方法,而是去寻找该异常处理流程中是否包含finally块,如果没有finally块,如果没有,程序立即执行return或throw语句,方法终止。如果有,系统立即开始执行finally块---只有finally块执行完成后,系统才会再次跳回来执行try和catch块中的return或throw语句,如果finally中也有return或throw语句,finally块就已经终止了方法,系统不会再跳回try块/catch块里的任何代码了。

 

  • Java7自动关闭资源的try语句

  Java7增强了try语句的功能,它允许try关键字后紧跟一对圆括号,圆括号可以声明/初始化一个或多个资源,此处的资源指的是那些必须在程序结束时显式关闭的资源(数据库连接,网络连接),try语句在该语句结束时自动关闭这些资源。需要指出的是,为了保证try语句能正常关闭资源,这些资源类必须实现AutoCloseable或Closeable接口,实现这两个接口就必须实现close方法。

   Java7几乎把所有的资源类(IO类,JDBC的Connection,Statement等接口)进行了改写,改写后资源类都实现了AutoCloseable或Closeable接口。如果程序需要,自动关闭资源的try语句后也可以带多个catch块和finally块。

 

  • Checked异常和Runtime异常

  Checked异常都是可以被处理修复的异常,所以Java程序必须显式处理Checked异常。如果程序没有处理Checked异常,该程序在编译时就会发生错误,编译不通过。

  Runtime异常无须显式声明抛出。

 

  • 使用Throws抛出异常

  如果某段代码中调用了带throws声明的方法,该方法声明抛出了Checked异常,表明该方法希望调用者来处理该异常。使用throws声明抛出异常时有一个限制,就是方法重写时“两小”原则:子类方法声明抛出的异常类型应该是父类方法声明抛出的异常类型的子类或相同,子类方法声明抛出的异常不允许比父类抛出的异常多。因为这样的限制,所以不推荐使用checked异常,当程序需要自行抛出异常时,使用Runtime异常更加简洁。

 

  • 自定义异常类

  用户自定义异常都应该继承Exception基类,如果希望自定义Runtime异常,则应该继承RuntimeException类,定义异常类时要提供两个构造函数,一个无参构造函数,另一个是带一个字符串参数的构造器,这个字符串将作为该异常对象的描述信息,在方法体重调用super(msg)。

posted on 2017-02-10 10:05  coder为  阅读(284)  评论(1编辑  收藏  举报