异常类的继承体系

主讲人:王少华  QQ群号:483773664

学习目标:

1、掌握异常的体系

2、掌握处理异常类的几中常用方法

一、异常类继承体系图

Java提供了丰富的异常类,这些异常类之间有严格的继承关系,如下图所示


从上图可以看出,Java把所有非正常情况分成两种,一种是异常(Exception),另一种是错误(Error),它们都继承Throwable父类。

二、Error

Error错误,一般是指虚拟机相关的问题。即仅靠程序本身无法恢复的严重错误。如系统崩溃、虚拟机出错误、动态链接失败等。这种错误通常应用程序无法处理。因为应用程序不应该试图使用catch块捕获这种异常。

三、Exception

由Java应用程序抛出和处理的非严重的错误,它分为运行时异常和非运行时异常。

运行时异常,包括RuntimeException及其所有子类,不要求程序必须对它们做出处理,即在程序中,即使用不使得try-catch或其他异常处理方式(如throws)进行处理,程序仍然可以编译和运行。

非运行异常,除了运行时异常外的其他由Exception继承来的异常类。它的特点是程序中的异常必理进行处理,否则会出现编译错误


四、几中常见的编译时异常

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class TestRunTimeException {
    public static void main(String[] args) {
        String paras[] = {};
        try {
            int a = Integer.parseInt(paras[0]);
            int b = Integer.parseInt(paras[1]);
            int c = a/b;
            System.out.println("你输入的两个数相除的结果是:"+c);
        } catch (IndexOutOfBoundsException e) {
            System.err.println("数组越界:运行时程序输入的参数个数不够");
        }catch (NumberFormatException e) {
            System.err.println("数字格式异常:程序只能接受整数参数");
        }catch (ArithmeticException e) {
            System.err.println("算术异常:除数不能为零");
        }catch (Exception e) {
            System.err.println("未知异常");
        }
    }
}
  • 如果运行该程序时,数组长度不够,将会发生数组越界异常:IndexOutOfBoundsException.Java将调用IndexOutOfBoundsException对应的catch块处理该异常

  • 如果运行该程序时,数组中的值不是数字,而是字母,则发生数字格式异常:NumberFormatException.Java将调用NumberFormatException对应的catch块处理该异常

  • 如果运行该程序时,除数是0,则发生除0异常:ArithmeticException。Java将调用ArithmeticException对应的catch块处理该异常

  • 如果运行该程序时,出现其他异常,该异常总是Exception类或其子类的实例,Java将调用Exception对应的catch块处理该异常

注:上面这些异常都是比较常见的异常,必须明白出现这些异常的条件。同时还有一些常见的异常:比如空指针异常(NullPointException)等,这些我们再以后学习和工作的过程中,慢慢熟悉和积累。

五、访问异常信息

如果程序需要在catch块中访问异常对象的相关信息,可以通过调用catch后异常形参的方法来获得。

所有异常对象都包含如下几个常用方法:

  • getMessage():返回该异常的详细描述的字符串

  • printStackTrace():将该异常的跟踪栈信息输出控制台

  • printStackMessage(PrintStream s):将该异常的跟踪栈信息输出到指定的输出流

  • getStackTrace():返回该异常的跟踪栈信息。

1
2
3
4
5
6
7
8
9
10
public class AccessExceptionMsg {
    public static void main(String[] args) {
        try {
            FileInputStream fiStream = new FileInputStream("a.txt");
        } catch (IOException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }
}


从上面的图可以看出,异常的详细描述信息是:a.txt (系统找不到指定的文件。)。下面更详细的信息是异常跟踪信息。