Java Exceptions

什么是异常

  • 错误在我们编写程序的过程中会经常发生,包括编译期间和运行期间的错误
  • 在程序运行过程中,意外发生的情况,背离我们程序本身意图的表现,都可以理解为异常

异常分类

  • Throwable
    • Error
      • OutOfMemoryError
      • ThreadDeath
    • Exception
      • 程序本身可以处理的异常
      • unchecked exception (runtime exception)
        • NullPointerException
        • ArrayIndexOutOfBoundsException
      • checked exception
        • IOException
        • SQLException

捕获异常

  • 对于运行时异常,错误或可查异常,Java技术所要求的异常处理方式有所不同
  • 对于可查异常必须捕捉,或者声明抛出
  • 允许忽略不可查的RuntimeException 和 Error

异常处理

  • 通过5个关键字来实现: try, catch, finally, throw, throws

捕获异常

  • try: 执行可能产生异常的代码
  • catch: 捕获异常
  • finally: 无论是否发生异常,总是执行的代码

声明异常

  • throws: 声明可能要抛出的异常

抛出异常

  • 手动抛出异常

try catch finally

  • try之后可以接零个或多个catch, 如果没有catch,则必须接一个finally

throw throws

  • 可以通过throws声明将要抛出何种类型的异常, 通过throw将产生的异常抛出

throws

  • 如果一个方法可能会出现异常,但没有能力处理这种异常,可以在方法声明处用throws子句来声明抛出异常
  • throws语句用在方法定义时,生命该方法要抛出的异常类型
  • 当方法抛出异常列表中的异常时,方法将不对这些类型及其子类类型的异常做处理,而抛向方法的调用者,由它去处理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public int divideIntegers(int a, int b) throws Exception {
return a / b;
}

public static void main(String[] args) {
try {
int answer = divideIntegers(5, 10);
} catch(ArithmeticException e) {

} catch(InputMismatchException e) {

} catch(Exception e) {

} finally {

}
}

throw

  • throw用来抛出一个异常
  • 抛出的只能够是可抛出类throwable或者其子类的实例对象
  • 自己抛出的异常,自己处理
  • 抛出异常使用throws由调用者处理

自定义异常

  • 使用Java内置的异常类可以描述在编程时出现的大部分异常情况
  • 也可以通过自定义异常描述特定业务产生的异常类型
  • 自定义异常就是定义一个类,去继承Throwable类或者它的子类
1
2
3
4
5
public class CustomException extends Exception {
public CustomExpcetion () {
super("Custom exception message");
}
}

异常链

  • 有时候我们会捕获一个异常后再抛出另一个异常

  • 顾名思义就是:将异常发生的原因一个穿一个穿起来,把底层的异常信息传给上层,这样逐层抛出

  • 新的异常可以保留原有异常的信息

  • 构造方法的定义如下

1
Exception(String mesasge, Throwable cause)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public void methodOne() throws FirstException {
throw new FirstException("first exception");
}

public void methodTwo() throws SecondException {
try {
methodOne();
} catch (FirstException e) {
throw new SecondException("Second Exception", e);
}
}

public void methodThree() throws ThirdException {
try {
methodTwo();
} catch (SecondException e) {
ThridException exception = new ThirdException("third exception");
exception.initCause(e); // initCause是Exception中的另外一个成员方法,用于添加cause,原有异常的信息
throw exception;
}
}