Java 异常处理

在日常开发中我们会碰到各种各样的异常信息,空指针、找不到文件、数组下标越界、内存异常等等。Java都是通过API中Throwable类的众多子类描述各种不同的异常,关系图如下所示:

Java 异常处理
 从上图可以看出,所有的异常类都是由Throwable继承下来的,但在下一层立即分为两个分支:Error和Exception。
一、异常分类
Error(错误)程序无法处理的错误。
这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,因为它们在应用程序的控制和处理能力之 外,而且绝大多数是程序运行时不允许出现的状况。
 
Exception(异常):是程序本身可以处理的异常。
 
异常(包含Error、Exception)可以分为为:
可查的异常(checked exceptions)和不可查的异常(unchecked exceptions)。
可查异常(编译器要求必须处置的异常):在程序运行中很容易发生、可以预见性发生的,Java编译器会检查,且要求在程序总必须处理的,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。
简单说RuntimeException及其子类之外的都属于可查异常。
 不可查异常(编译器不要求强制处置的异常):包括运行时异常(RuntimeException与其子类)和错误(Error)。
Exception 这种异常分为两种,程序中应当尽可能去处理这些异常。
1、运行时异常:都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等。
这类异Java编译器不会检查它,在程序中可以处理,也可以不处理。即使没有try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。
2、非运行时异常 (编译异常):是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常
二、异常处理
Java中对异常的处理:抛出异常,捕捉异常
 1、捕捉异常通过try-catch语句或者try-catch-finally语句实现。
关于其的使用,异常处理的原则和建议:这篇文章说的非常好,这里这引用下地址。
 2、抛出异常信息,throws语句用在方法定义时声明该方法要抛出的异常类型,如果抛出的是Exception异常类型,则该方法被声明为抛出所有的异常。多个异常可使用逗号分割。throws语句的语法格式为:
 3、 Throwable类中的常用方法
注意:catch关键字后面括号中的Exception类型的参数e。Exception就是try代码块传递给catch代码块的变量类型,e就是变量名。catch代码块中语句”e.getMessage();”用于输出错误性质。通常异常处理常用3个函数来获取异常的有关信息:
getCause():返回抛出异常的原因。如果 cause 不存在或未知,则返回 null。
getMeage():返回异常的消息信息。
printStackTrace():对象的堆栈跟踪输出至错误输出流,作为字段 System.err 的值。
有时为了简单会忽略掉catch语句后的代码,这样try-catch语句就成了一种摆设,一旦程序在运行过程中出现了异常,就会忽略处理异常,而错误发生的原因很难查找。