异常处理

Exception类的层次

异常概述

在Java编程中,异常是指在程序执行期间可能发生的错误或意外情况。当发生异常时,它会打断正常的程序流程并且可能导致程序终止。Java提供了异常处理机制,允许开发者在代码中捕获和处理异常,从而提高程序的健壮性和稳定性。
为了有效地处理异常,Java提供了一些关键字和语句,例如try、catch、finally、throw和throws。通过使用这些关键字,开发者可以捕获异常并采取相应的措施来处理异常情况,保证程序的稳定性和可靠性。

  • 编译时异常是在编译成class文件时必须要处理的异常,也称为受检异常
  • 运行时异常是在运行字节码文件时出现的异常,也称为非受检异常

Exception 和 Error 区别

在Java中,Exception和Error都是Throwable类的子类,但它们在用途和处理方式上有所不同。

Exception:

  • Exception类代表程序可以处理的异常情况。它分为两种类型:已检查异常(checked exceptions)和未检查异常(unchecked exceptions)。
  • 已检查异常(Checked Exception)在编译时强制进行检查,必须通过try-catch块或者throws语句进行处理。
  • 未检查异常(Unchecked Exception)指的是运行时异常,不需要在代码中显式地进行处理。常见的未检查异常包括NullPointerException和ArrayIndexOutOfBoundsException等。

Error:

  • Error类代表程序无法处理的错误,通常是虚拟机运行时的错误。它们表示的是严重的问题,大多数情况下程序无法恢复。
  • Error不应该被程序捕获和处理,因为捕获Error可能会导致程序状态不稳定甚至崩溃。
  • 常见的错误包括OutOfMemoryError和StackOverflowError等。

因此,主要区别在于程序可以处理的异常应该使用Exception类,而程序无法处理且可能导致程序崩溃的严重问题应该使用Error类。通常情况下,开发人员应该捕获并处理异常,但不应该捕获并处理错误。

虚拟机默认处理异常方式

  1. 在产生异常的代码处生成一个异常对象,接着查看是否有处理异常的代码,如果没有就交给调用者处理,如果调用者也不处理则最终交给虚拟机
  2. 虚拟机将异常的名称,异常原因以及异常出现的位置等信息输出在控制台
  3. 程序停止运行

使用throws处理异常

  • 格式:throws 异常类名
  • 注意:写在方法的定义处,表示显式声明一个异常
  • 这种异常异常处理方式主要用于编译时异常,如果声明的异常是运行时异常则声明处的代码可以省略
  • throws声明一个异常表示当前方法内不处理这个异常,而是交给调用者处理,如果调用者也不处理则最终交给虚拟机采用默认的处理方式

使用throw抛出异常对象

  • 格式:throw new 异常类名();
  • 注意:写在方法内部,表示在当前的代码处手动抛出一个异常,下面的代码不用再执行
  • 给方法的调用者抛出了一个异常

使用try...catch处理异常

1
2
3
4
5
try{
// 可能出现异常的代码
}catch(异常类名 变量名){
// 处理异常的代码
}
  • 作用是可以让程序继续执行下去
  • 如果try块中没有出现异常,则程序会将try块的代码执行完毕,然后跳过catch块的代码继续执行下去
  • 如果try块中某行代码出现异常,则该行后面的代码不再执行转而去执行catch块中的代码,然后继续执行下去
  • 如果try块中出现的异常没有被捕获,则直接在出现异常的代码处停止执行,将异常交给虚拟机处理,程序不再执行下去
  • 如果try块中出现多个异常,那么只需要添加多个catch块处理,如果多个异常存在继承关系,那么父类catch块需要写在最下方,发生异常时只会匹配一个catch块
  • 写多个catch块的好处是可以针对不同的异常有不同的处理方式

Throwable成员方法

Throwable 是所有异常类的父类,所以所有异常对象都能使用该类的方法

方法名 说明
public String getMessage() 返回详细消息字符串
public String toString() 返回简短描述字符串
public void printStackTrace() 将异常信息打印输出在控制台

自定义异常

  • 所有异常都必须是 Throwable 的子类
  • 如果希望写一个检查性异常类,则需要继承 Exception 类
  • 如果你想写一个运行时异常类,那么需要继承 RuntimeException 类
1
2
class MyException extends Exception{
}

throws 和 throw 对比

作用 位置 后接对象
throws 异常处理方式 方法声明处 异常类型
throw 生成异常对象的关键字 方法体中 异常对象