异常分类
异常主要是分为exception和error,继承关系如下:
从继承关系可知: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
}
注意
- try里面不要放return,如果放了return就不会抛出异常了
- 在抛出异常的时候,尽量将异常的范围缩小,确保看到异常可以知道是出现了什么问题,而不是直接一个exception
- finally中有return的时候,会覆盖掉catch中的return
参考: