明辉手游网中心:是一个免费提供流行视频软件教程、在线学习分享的学习平台!

Java编程思想读书笔记(10章上)

[摘要]第10章 通过异常处理错误   一. 基本异常    1. 抛出异常的原理    1) 像产生一个Java对象那样在heap上以new产生一个异常对象。    2) 停止目前的执行路线,将上述那个异常对象的reference自目前的context丢出。    3) 异常处理机制接手工作,寻找得以继...
第10章 通过异常处理错误

  一. 基本异常

   1. 抛出异常的原理

   1) 像产生一个Java对象那样在heap上以new产生一个异常对象。

   2) 停止目前的执行路线,将上述那个异常对象的reference自目前的context丢出。

   3) 异常处理机制接手工作,寻找得以继续执行的适当地点。

   2. 产生一个异常对象

   异常类有两个构造函数:一个default构造函数;一个带String型参数的构造函数,参数的信息可以通过异常类中的各种方法取出。

   3. 异常类的结构

   1) Error是一些编译期错误或系统错误,一般无需在程序中捕捉到Error异常。

   2) Exception是我们能捕捉到的异常,其中Exception异常又分为RuntimeException和non-RuntimeException两大类异常。

   二. 异常的捕捉和处理

   1. 异常的捕捉

   1.1 通过try…catch就可捕捉异常

   import java.lang.RuntimeException;
   import java.lang.NullPointerException;
   import java.sql.SQLException;
   import java.io.IOException;
   class TestException{
   public void testSQLException() throws SQLException {
   throw new SQLException();
   }
   public void testIOException() throws IOException {}
   }
   public class Test{
   public static void main(String[] args){
   TestException te = new TestException();
   try{
   te.testSQLException();
   te.testIOException();
   }
   catch(SQLException ex){
   System.out.println("catch SQLException in main");
   }
   catch(IOException ex){
   System.out.println("catch IOException in main");
   }
   catch(Exception ex){ //(1)

   System.out.println("catch Exception in main");
   }
   }
   }
   运行结果为:catch SQLException in main
   只有参数类型与异常类型相同或相近的catch会被执行。

   1.2 捕捉所有异常

   如果想捕捉所有异常,只要捕捉Exception异常就行,如上面代码的(1)处
   2. 异常规格(exceptionspecification)

   1) 在函数定义时可以声明异常规格。如果一个函数在异常规格中声明了non-RuntimeException异常,那么当调用这个函数时,就一定要捕捉异常规格中的non-RuntimeException异常。

   import java.lang.RuntimeException;
   import java.lang.NullPointerException;
   import java.sql.SQLException;
   class TestException{
   //(1)异常规格中声明将抛出RuntimeException异常
   public void testRuntime() throws RuntimeException {}
   //(2)异常规格中声明将抛出NullPointerException异常
   public void testNullPointer() throws NullPointerException {}
   //(3)异常规格中声明将抛出non-RuntimeException异常
   public void testNonRuntime() throws SQLException {}
   }
   public class Test{
   public static void main(String[] args){
   TestException te = new TestException();
   te.testRuntime();//(4)

   te.testNullPointer();//(5)

   //te.testNonRuntime();(6)

   try{
   te.testNonRuntime();
   }
   catch(SQLException ex){}
   }
   }
   在上述代码中,(1)处在异常规格中声明将抛出RuntimeException;(2)在异常规格中声明将抛出NullPointerException,而NullPointerException是RuntimeException的子类,所以在调用这两个函数时,可不捕捉异常,如(4)(5)处的代码一样直接调用。但(3)处在异常规格中声明将抛出SQLException,而SQLException不是RuntimeException的子类,所以必须捕捉SQLException异常。

   2) 如果要在一个函数中抛出non-RuntimeException异常,则必须要在异常规格中声明该异常。

   import java.sql.SQLException;
   import java.io.IOException;
   class Test1{
   public void f() throws SQLException{//(2)

   throw new IOException("IOException"); //(1)

   }
   }
   public class ExplicitStatic{
   public static void main(String[] args){
   Test1 te = new Test1();
   try{
   te.f();
   }
   catch(Exception ex){
   System.out.println("catch Exception in main");
   }
   }
   }
   在(1)处抛出了一个没有在异常规格中被声明的non-RuntimeException异常,在编译时会出错。