什么是异常
正如文档开头所说,世界上并没有完美的程序,程序在运行中可能会存在着异常状态,这种异常状态,可能是异常(Exception),也可能是错误(Error),一个健壮性的程序就要考虑程序可能存在的异常状态,并对其进行处理。Throwable类是Java中所有错误和异常的超类,位于java.lang包,从JDK1.0开始引入。Throwable有两个子类Exception(Java中所有异常类的父类)和Error(Java中所有错误类的父类)。
错误往往是程序运行时发生,程序员不可控制,对程序造成不可逆转的影响,比如Java中OutOfMemoryError,内存溢出,导致程序宕机,错误在代码中通常被忽略,它们在编译也检查不到的,当然好的编程习惯合理运用各种数据结构,提升代码质量等等会减少OOM的发生率。
异常会在编译或者运行时被发现,需要程序员去处理一部分异常,捕获异常,并合理的处理能保证程序的健壮性,让程序继续往下执行,不至于某个部分异常影响到整个应用,因此Java中异常类(Exception)是需要重点去学习关注的,下面所说的异常也都指Exception及其子类出现的异常
受检异常(CheckedException)
一般由外部错误引起,发生在编译阶段,Java编译器会强制捕获这类异常,要求使用try catch捕获。
如果期望调用者能够适当的恢复,应该使用受检异常。
运行时异常(RuntimeException)
在Java虚拟机运行期间抛出的异常,出现运行时异常,通常都是程序员的错误导致的。//加入Java开发交流君样:756584822一起吹水聊天
使用运行时异常表示编程错误,不应该也不需要捕获运行时异常。
常见异常
Java中内置了一些异常类来描述程序可能出现的受检异常和运行时异常。
运行时异常
异常处理
程序产生的运行时异常往往是程序员的错误导致的,不应该去捕获运行时异常,受检异常需要我们去处理,保证程序的健壮性。Effecive Java中对于异常的处理通常有下面几种原则:
-
异常应该只用于异常情况下,不应该用作流程控制
-
对可恢复的情况使用受检异常,对编程错误使用运行时异常
-
避免不必要的使用受检异常
-
优先使用标准异常
-
努力使失败保持原子性,失败的方法调用应该保持对象在调用之前的状态
-
不要忽略异常