Java异常
开始前还是来个小测试,下面的程序运行结果是什么?
测试
Inner Exception没有了,为什么会出现上面的结果呢?原因就是在try-finally中,如果finally中有throw和return,就会覆盖try-catch中的throw和return。
废话少说,今天来看看Java的异常处理。
Java的异常
谈论Java的异常之前,先看看异常处理程序能带来什么好处?明显的好处是降低错误处理代码的复杂度。Java中的异常处理机制能帮忙开发者简化处理异常的成本,如果发生异常了可以有两种方式处理,第一种为捕捉异常并尝试恢复,比如网络异常,超时异常等,另一种就是向高层调用抛出异常。
Java中的异常处理机制就是用关键字try-catch-finally,throw或者throws处理,下面就分别说明使用方:
Try代码块用于监听程序是否出现问题,也就是监听有可能发生问题的代码块Catch捕捉异常,可以指定特定异常进行捕捉Finally关键字后面的代码块,在try-catch后总会执行,用来关闭文件,关闭连接等。Throw抛出异常,如果我们不想处理这个异常,可以通过throw抛出,也可以转换成新的异常抛出Throws给方法签名指定可能抛出的异常。Java的异常的基类是Throwable,这个类实现了Serializable接口,因此是可以序列化的,并且提供了存储和打印执行异常栈的信息。
Throwable有两个子类实现类,一个是Error,另一个就是Exception。Error代表不可恢复的错误,属于JVM内部的错误,比如系统内存溢出了;Exception表示系统出现了一些问题,但是还不至于系统完全不可用,通过重试或者改变输入参数有可以恢复的异常,有包括检查异常和非检查异常。
检查异常(ChekedEcxception):检查异常继承于Exception,这类异常如果不处理在编译期间就会报错,比如数据库连接异常DataAccessException,文件不存在异常FileNotFoundException,IO异常IOException等。非检查异常:程序运行中产生的异常,在程序的编译时候可以忽略的异常,比如RuntimeException,或者继承与RuntimeException的异常。
检查和非检查异常
以下是一个读取文件的例子,在读取文件的时候会发生FileNotFoundExcepton和IOException,我们都进行了捕捉,最后在finally中关闭了打开的文件。
一个自定义异常实例
自定义异常
在开发中发现JDK提供的异常无法满足目前的需要,可以通过集成已有的异常类来自定义异常。
在自定义异常的时候,是定义检查异常还是非检查异常?以下是个人见解,
如果一个问题需要显示的处理,比如调用其他系统接口的时候,服务不可用,就可定义为检查异常,自定义的检查异常是要求在编程的时候必须处理的。
业务的异常通过通过继承RuntimeException来定义非检查异常,比如参数错误,结果找不到等,这类异常都是在运行期间发生的,我们不用在调用的地方显示的处理,可以在一个地方统一的处理。
下面就定一个检查参数的异常类继承于RuntimeException,定义一个错误code用来记录错误的代码。
自定义异常
欢迎留言讨论,如果有任何错误,请批评指正,非常感谢!