java异常体系
Exception vs Error
在Java里面,所有的异常都是继承自java.lang.Throwable类,Throwable有两个直接子类,Error和Exception。
二者最大的区别:异常能被程序本身处理,而错误不能处理。
1、Exception
Exception表示程序中的异常,可能是由于程序不严谨导致的,比如NullPointerException。
2、Error
Error用来表示程序底层或者硬件有关的错误,这种错误和程序本身无关,比如常见的OOM异常。这种异常和程序本身无关,所以不需要检查,属于非受检异常。
编译期异常 vs 运行时异常
Exception 又分为编译期异常 和 运行期异常
编译时异常必须显示处理,所以也叫受检异常
运行时异常交给java虚拟机,不用程序员手动处理,所以也叫非受检异常
之所以在Java中要设计一些强制检查的异常,我认为主要原因是考虑到程序的正确性、稳定性和可靠性。
比如数据库异常、文件读取异常,这些异常是程序无法提前预料到的,但是一旦出现问题,就会造成资源被占用导致程序出现问题。
所以这些异常我们需要主动捕获,一旦出现问题,我们可以做出相应的处理,比如关闭数据库连接、文件流的释放等。
try-catch、throw、throws
各自特点
- throws
如果一个方法可能
会有异常,但你并不想处理这个异常,就在方法名后面用throws,这样这个异常就会抛出,谁调用了这个方法谁就要处理这个异常,或者继续抛出.允许throws后面跟着多个异常类型,用逗号隔开; - throw
一般会用于程序出现某种逻辑时程序员主动抛出
某种特定类型的异常,throw只会出现在方法体中,当方法在执行过程中遇到异常情况时,将异常信息封装为异常对象
,然后throw出去。 - try/catch
就是用catch 捕获 try 中的异常并处理,当try中有异常抛出时不是中断执行,而是转而执行catch中的代码;一般在catch中throw自定义异常,
throw和throws对比
1、throws出现在方法头;而throw出现在方法体中。
2、throws表示出现异常的一种可能性,异常并不一定会发生。而throw表示异常已经发生了。
3、两者都是消极处理异常的方式,只是抛出异常,交给上层调用函数处理。
try…catch和throws/throw的对比
try…catch将异常自己解决掉,而throws/throw是自己不解决,抛出exception让别人去捕获,当然别人也可以不解决继续抛出。
异常处理的建议
只在必要使用异常的地方才使用异常,异常使用过多会影响正常程序的执行
抛出的异常信息尽可能准确,不要图方便随便抛出一个exception,到排查问题时就惨了的。
一定记得在finally中释放资源!!