一、背景介绍
java 程序在运行过程中发生错误或异常情况是不可避免的,如果每次错误都由程序员手动控制和处理,其工作量极大,对于程序员来说,如果将过多的精力放在异常的处理上,程序员就可以不用再做其他事情了。
Java语言定义了很多异常类,将运行错误和异常的信息和处理方法封装在了异常类中,帮助程序员检查和控制异常,这样程序员就可以将时间和精力放在业务逻辑的实现上,而这套机制就是java的异常处理机制。
二、异常分类
Java语言按照错误严重性,从throwale根类衍生出Error和Exception两大派系
Error(错误)
Exception(异常)
编译时异常:
运行时异常:
所以,java语言处理运行时错误有三种方式,一是程序不能处理的错误,
二是程序应该避免而可以不去捕获的运行时异常,
三是必须捕获的非运行时异常。
三、java异常处理机制
java默认处理机制:
1 抛出异常
2终止程序
异常处理程序机制:
1抛出异常
2try-catch-finally 捕获和处理异常
关键字
语法 try-catch
语法 finally
(***):不管是否有异常都会执行,即使使用return强制结束也会执行,唯一不执行情况System.exit(status);
(***):排列catch 语句的顺序:先子类后父类,发生异常时按顺序逐个匹配,只执行第一个与异常类型匹配的catch语句
语法 throws
语法 throw
四、如何优雅的设计异常
如何选择异常
应该抛出怎样的异常
ok,看了以上代码以后,你也许心中有一些想法,原来受检异常可以控制义务逻辑,对,没错,通过受检异常真的可以控制业务逻辑,但是切记不要这样使用,我们应该合理的抛出异常,因为程序本身才是流程,异常的作用仅仅是当你进行不下去的时候找到的一个借口而已,它并不能当成控制程序流程的入口或出口,如果这样使用的话,是在将异常的作用扩大化,这样将会导致代码复杂程度的增加,耦合性会提高,代码可读性降低等问题。那么就一定不要使用这样的异常吗?其实也不是,在真的有这样的需求的时候,我们可以这样使用,只是切记,不要把它真的当成控制流程的工具或手段。那么究竟什么时候才要抛出这样的异常呢?要考虑,如果调用者调用出错后,一定要让调用者对此错误进行处理才可以,满足这样的要求时,我们才会考虑使用受检异常。
应该选用哪种异常
通过以上的描述和举例,可以总结出一个结论,RuntimeException异常和受检异常之间的区别就是:是否强制要求调用者必须处理此异常,如果强制要求调用者必须进行处理,那么就使用受检异常,否则就选择非受检异常(RuntimeException)。一般来讲,如果没有特殊的要求,我们建议使用RuntimeException异常