java异常处理机制

来源:互联网 发布:淘宝代购服装是真的吗 编辑:程序博客网 时间:2024/06/07 14:35

一.异常分类

1.所有异常的父类为 Exception,该类继承于 Thowable,还有一个Erroe类也继承于 Throwable.当遇到error类的异常时不需要程序员处理(通常重启程序)。开发人员需要处理 Exception类的异常。Exception表示由于网络故障、文件损坏、设备错误、用户输入非法等情况导致的异常,这类异常是可以通过Java异常捕获机制处理的。而Error表示Java运行时环境出现的错误,例如:JVM内存溢出等。

2.Exception 又分为 checkedException 和 uncheckedException(可检测和不可检测)。

编写代码时,编译器报错提示要处理异常,这种称为 checkedException; 编译器没有报错,而在运行时报出的异常称为uncheckedException又称运行时异常RuntimeException。

3.常见的运行时异常:

NullPointerException  空指针异常

ClassCastException  类型转换异常

ArrayIndexOutoBoundsException 数组下标越界异常

NumberFormationException 数字格式异常

二.异常处理

1.异常处理流程

方式一:

当程序中抛出一个异常后,程序从程序中导致异常的代码处跳出,java虚拟机检测寻找和try关键字匹配的处理该异常的catch块,如果找到,将控制权交到catch块中的代码,然后继续往下执行程序,try块中发生异常的代码不会被重新执行。如果没有找到处理该异常的catch块,在所有的finally块代码被执行和当前线程的所属的ThreadGroup的uncaughtException方法被调用后,遇到异常的当前线程被中止。 无论是否有异常产生,finally中的 代码都会被执行


方式二:

throws关键字

程序中会声明许多方法(Method),这些方法中可能会因某些错误而引发异常,但您不希望直接在这个方法中处理这些异常,而希望调用这个它的方法来统一处理,这时候您可以使用“throws”关键词来声明这个方法将会抛出异常

例如:

  1.         public static void stringToDate(String str) throws ParseException{             ……
  2.         }
注意:

重写方法时的throws

当使用继承时,在父类的某个方法上声明了throws抛出某些异常,而在子类中重写该方法时,我们可以做以下的操作:

  • 不处理异常(重写方法时不声明throws)
  • 可仅在throws中声明父类中声明的部分异常
  • 可在throws中声明父类方法中抛出的异常的子类异常

但是不能做以下操作:

  • 重写方法时在throws中声明抛出额外的异常
  • 重写方法时在throws中声明父类方法中声明的抛出异常的父类异常

方式三:

throw关键字

当程序发生错误而无法处理的时候,会抛出对应的异常对象,除此之外,在某些时刻,您可能会想要自行抛出异常,例如在异常处理结束后,再将异常抛出,让下一层异常处理区块来捕捉,若想要自行抛出异常,您可以使用“throw”关键词,并生成指定的异常对象。

例如:

  1.         throw new ArithmeticException();

2.异常类的常用方法

 ① printStackTrace() 打印所有的异常信息

getMessage

Throwable中定义了一个方法可以得到有关异常事件的信息。该方法定义为:

  1.         String getMessage()

例如:

  1.         try{
  2.             …
  3.         }catch(Exception e){
  4.             System.out.println(e.getMessage());
  5.         }

很多时候,当一个异常由另一个异常导致异常而被抛出的时候,Java库和开放源代码会将一种异常包装成另一种异常。这时,日志记录和打印根异常就变得非常重要。Java异常类提供了 getCause()方法来检索导致异常的原因,这些可以对异常根层次的原因提供更多的信息。该Java实践对代码的调试或故障排除有很大的帮助。另外,如果要把一个异常包装成另一种异常,构造一个新异常就要传递源异常。

  1. Throwable getCause()

获取该异常出现的原因。

3.

每个try语句块可以伴随一个或多个catch语句,用于处理可能产生的不同类型的异常 。catch捕获的异常类型由上至下的捕获异常类型的顺序应是子类到父类的

例如

  1.         try{
  2.             …
  3.         }catch(NullPointerException e){    //子类异常应在上面捕获
  4.             …
  5.         }catch(RuntimeException e){        //父类异常在下面捕获
  6.           …    
  7.         }catch(Exception e){            //应养成最终捕获Exception的习惯
  8.           …
  9.         }

通常在书写代码的时候,我们应当在最后一个catch中捕获Exception,这样可以保证代码不会因为出现一个未在catch中声明的异常而导致捕获失败使得程序终止。

4.try,catch,return,finally 执行顺序

①return 在try语句中且无异常则:try-先确定return的值不会结束程序-finally-返回return的值。

②若return在finally中则会覆盖try中的return值,建议不要在finally中写return

总结:执行try-catch,给返回值赋值,执行finally,最后return。


三.自定义异常

具体步骤如下:

  1. 声明一个类并继承自Exception
  2. 右键点击Source
  3. 选择Generate Constructors from Superclass
  4. 选中父类中所有构造方法后确认生成

例如:

  1.         public class MyException extends Exception{
  2.             public MyException() {
  3.                 super();
  4.             // TODO Auto-generated constructor stub
  5.             }
  6.             public MyException(String message, Throwable cause) {
  7.                 super(message, cause);
  8.                 // TODO Auto-generated constructor stub
  9.             }
  10.             public MyException(String message) {
  11.                 super(message);
  12.                 // TODO Auto-generated constructor stub
  13.             }
  14.             public MyException(Throwable cause) {
  15.                 super(cause);
  16.                 // TODO Auto-generated constructor stub
  17.             }
  18.     
  19.         }