exception_hierarchy

第九章 Java语言的异常(Exception)类型

1 简介

在Java语言的异常处理中,所有的异常(Exception)和错误(Error)都被封装成了对象。在程序运行的过程中,如果发生异常或者错误,Java虚拟机会根据错误的类型,抛出不同类型的异常和错误对象,以便于程序捕抓错误/异常,并做相应的处理和调整。在程序中,开发人员可以使用try...catch语句来捕抓异常,并进行错误处理。在异常和错误的继承结构中,错误类(Error Class)和异常类(Exception Class)是继承自Throwable类的。错误类(Error Class)和异常类(Exception Class)的区别是:错误指的是那些导致程序无法继续运行的错误,而异常是那些希望并且能够处理和恢复的错误。在异常类中,异常又可分为运行时异常(Runtime Exception)和编译时异常(Compile Time Exception)。在图一中,Throwable类用黄色标识,错误类使用红色标识,异常类使用蓝色标识。

另外,还有两个与异常相关的术语。未检查异常(Unchecked Exception)包括所有的错误类(Error Class)和运行时异常(Runtime Exception)。 其他的异常被称为检查异常(Checked Exception)。换句话说,Java语言要求Java程序必须使用try...catch语句捕抓和处理检查异常(Checked Exception),而未检查异常(Unchecked Exception)则不需要程序捕抓处理。

图一 Java语言异常类型继承关系图

图一 Java语言异常类型继承关系图

2 Checked Exception和Unchecked Exception

在本小节,我们简单对比一下Checked Exception和Unchecked Exception。

Checked ExceptionUnchecked Exception
在编译时由编译器检查的异常在编译时不被检查
只会在注明了可能抛出该异常的语句发生Unchecked Exception可能会在任何时间、任何地方被抛出。
程序必须处理这些异常程序不需要明确处理这些异常。处理Unchecked Exception是可选的。
 如果Unchecked Exception被抛出,且未被程序捕抓,则Java虚拟机会调用dispatchUncaughtException()方法。该方法进而调用Thread.getUncaughtExceptionHandler()方法,以找出处理未被捕抓异常(Uncaught Exception)的默认处理方式。

 

2.1 Checked Exception

使用Checked Exception的例子较为常见。例如,在下面的例子中,load()方法从输入文件中读取一行字符,并将其打印到标准输出中。 读取字符的方法readLine()和关闭close()方法都可能抛出IOException的异常。因为IOException是Checked Exception,所以,load()方法必须捕捉该异常,或者标注该方法可能抛出该异常。

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
  
public class CheckedExceptionExample { 
    public void load1(String filename) {
        try { // 使用try...catch语句捕抓IOException
            BufferedReader reader = new BufferedReader(new FileReader(filename));
            System.out.println(reader.readLine()); // 此行可能抛出IOException
            reader.close();  // 此行可能抛出IOException
        } catch (IOException ex) { 
            System.out.println(ex.getMessage());
        }
    }

    public void load2(String filename) throws IOException { // 标注该函数可能抛出IOException
        BufferedReader reader = new BufferedReader(new FileReader(filename));
        System.out.println(reader.readLine());
        reader.close();
    } 
}

2.2 Unchecked Exception

算术计算异常ArithmeticException是一种常见的运行时异常。例如,在下面的代码中,如果在程序运行的过程中发生除零异常,则Java虚拟机会抛出ArithmeticException。然而,在编译中,编译器并不检查该异常,也不要求程序捕抓该异常。但是,当Unchecked Exception发生时,Java虚拟机会捕抓程序为捕抓的异常。下面的程序运行时会打印"Exception in thread "main" java.lang.ArithmeticException: / by zero"的异常信息。

public class UncheckedExceptionExample { 
   public static void main(String args[]) { 
      int i = 0; 
      int j = 10; 
      System.out.println(j/i); 
  } 
} 

3 结语

本章介绍了Java语言中异常类型的继承结构。所有的异常和错误均继承自Throwable类。Error代表的是程序难以恢复的异常类型;Exception则表示的是程序可以处理或者恢复的异常类型。对于编译器而言,编译器只检查Exception类型中,非实时抛出的异常(Non-Runtime Exception)。这种异常被称为Checked Exception。其他的异常则被称为Unchecked Exception。

上一章
下一章

注册用户登陆后可留言

Copyright  2019 Little Waterdrop, LLC. All Rights Reserved.