JAVA异常处理规范

2,025 阅读2分钟

异常分类

异常主要是分为exception和error,继承关系如下:

image.png

从继承关系可知:Throwable是异常体系的根,它继承自Object。Throwable有两个体系:Error和Exception

Error

Error表示严重的错误,程序对此一般无能为力,例如:

OutOfMemoryError:内存耗尽 NoClassDefFoundError:无法加载某个Class StackOverflowError:栈溢出

Exception

Exception是运行时的错误,它可以被捕获并处理。

逻辑处理

某些异常是应用程序逻辑处理的一部分,应该捕获并处理。例如:

NumberFormatException:数值类型的格式错误 FileNotFoundException:未找到文件 SocketException:读取网络失败

程序出错

还有一些异常是程序逻辑编写不对造成的,应该修复程序本身。例如:

NullPointerException:对某个null的对象调用方法或字段 IndexOutOfBoundsException:数组索引越界

分类

运行时异常

运行时异常就是RuntimeException以及它的子类;

非运行时异常

非运行时异常其实就是非RuntimeException(包括IOException、ReflectiveOperationException等等)

Java规定

  • 必须捕获的异常,包括Exception及其子类,但不包括RuntimeException及其子类,这种类型的异常称为Checked Exception。
  • 不需要捕获的异常,包括Error及其子类,RuntimeException及其子类。

异常捕获

try catch

众所周知,在java中try catch是一个非常经典的捕获异常的方式。

try {
//执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行。否则不会执行catch里面的内容           
} catch (Exception e) {
  //除非try里面执行代码发生了异常,否则这里的代码不会执行
}
//finally可有可无
finally {
//不管什么情况都会执行,包括try catch 里面用了return ,可以理解为只要执行了try或者catch,就一定会执行 finally
}

注意

  1. try里面不要放return,如果放了return就不会抛出异常了
  2. 在抛出异常的时候,尽量将异常的范围缩小,确保看到异常可以知道是出现了什么问题,而不是直接一个exception
  3. finally中有return的时候,会覆盖掉catch中的return

参考: