Java异常处理Exception的一点体会

Java基础之异常处理Exception的一点体会

一、异常的结构划分

所有异常都继承于Throwable类,Throwable有两大子类:

1、Error类,无法捕获的异常,常见的有内存溢出等系统性错误;

2、Exception,分为检查异常和非检查异常,检查异常指编译器可以识别、发现,强制程序猿进行处理的异常,常见的有FileNotFound等;非检查异常也称运行时异常,均为RuntimeException的派生类,编译器不能识别,自然不会强制要求程序猿进行异常处理。

二、异常处理语句throws/throw、try/catch/finally

throws: 用于函数声明可能抛出的异常,将异常传播给调用者(前提:内部没有做catch捕获处理);

throw :抛出异常实例,一个函数内抛出了异常实例,要么自身catch捕获处理,要么throws传播给调用者处理;

finally :无论是否抛出异常,finally语句总是执行。

throws-throw和throw-try/catch的区别:前者指抛出了异常,未捕获,阻塞了后面的语句的执行;而try/catch后的语句是可以正常执行的。

public class ExceptionTest {

   public static void display(int num) throws Exception{
       //1、一个函数内抛出了异常实例,
       //要么使用throws抛出交由调用者处理,要么自己catch捕获处理
       if(num>9){
           try{  
            throw new Exception("num大于9");
       }catch(Exception e){  //2、自身捕获处理
           e.printStackTrace();
       }
       }
   }

public static void main(String[] args){

            try {
                ExceptionTest.display(56);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                System.out.println("第一个catch一旦捕获后,之后的catch不执行"); //display()方法已捕获,此处不执行
                e.printStackTrace();
            }
            finally{
                System.out.println("虽然此处并未捕获异常,finally仍然执行");
            }

  }

}

输出:

java.lang.Exception: num大于9
    at exceptionPackage.ExceptionTest.display(ExceptionTest.java:9)
    at exceptionPackage.ExceptionTest.main(ExceptionTest.java:19)
虽然此处并未捕获异常,finally仍然执行

三、异常链传播

假设调用关系:

method3调用method2,method2调用method1,一旦method1发生异常,会将异常向上层传播,直到遇到catch捕获处理语句,若无处理语句,将由调用线程抛出给JVM。

//method2处理异常,停止向上传播

package exceptionPackage;

public class ExceptionTest {
    public static void method1() throws Exception{
        throw new Exception("method1 抛出异常");
    }
    public static void method2() throws Exception {
        try{
        ExceptionTest.method1();
        }
        catch(Exception e){
            e.printStackTrace();
            System.out.println("method2处理了异常,停止了本次异常的传播.");
        }
    }
    public static void method3() throws Exception{
//        try {
            ExceptionTest.method2();
/*        } catch (Exception e) {
            // TODO Auto-generated catch block
            System.out.println("method3处理异常");
        }*/
    }

    public static void main(String[] args) throws Exception {
            ExceptionTest.method3();
    }
}

输出:

java.lang.Exception: method1 抛出异常
    at exceptionPackage.ExceptionTest.method1(ExceptionTest.java:5)
    at exceptionPackage.ExceptionTest.method2(ExceptionTest.java:9)
    at exceptionPackage.ExceptionTest.method3(ExceptionTest.java:18)
    at exceptionPackage.ExceptionTest.main(ExceptionTest.java:26)
method2处理了异常,停止了本次异常的传播.

//异常一直传播到JVM

package exceptionPackage;

public class ExceptionTest {
    public static void method1() throws Exception{
        throw new Exception("method1 抛出异常");
    }
    public static void method2() throws Exception {
    //    try{
        ExceptionTest.method1();
    //    }
    /*    catch(Exception e){
            e.printStackTrace();
            System.out.println("method2处理了异常,停止了本次异常的传播.");
        }*/
    }
    public static void method3() throws Exception{
//        try {
            ExceptionTest.method2();
/*        } catch (Exception e) {
            // TODO Auto-generated catch block
            System.out.println("method3处理异常");
        }*/
    }

    public static void main(String[] args) throws Exception {
            ExceptionTest.method3();
    }
}

Exception in thread "main" java.lang.Exception: method1 抛出异常
    at exceptionPackage.ExceptionTest.method1(ExceptionTest.java:5)
    at exceptionPackage.ExceptionTest.method2(ExceptionTest.java:9)
    at exceptionPackage.ExceptionTest.method3(ExceptionTest.java:18)
    at exceptionPackage.ExceptionTest.main(ExceptionTest.java:26)

猜你喜欢

转载自passion99.iteye.com/blog/2336708