浅谈Java异常的分类与处理

关于Java异常的分类与处理,可以说在Java 中,所有的异常派生于 Throwable 接口。这些异常,又被分为 Error 和 Exception。这两类异常,又衍生了一些子类。

不过,我们应当把精力放在 RuntimeException 上,因为“所有的运行时异常,都是程序员的问题”。这类异常,又被叫做未检查异常,通常交由 JVM 处理。相对应的,那些我们知道可能会出现问题、,被叫做已检查的异常。这类异常需要开发者手动向上级抛出,直到 JVM 级别,或者在调用方法时使用 try-catch 处理。

异常捕获:在编码过程中,如果方法的检查异常被精心设计,那么我们只管抛出异常即可。但是,一旦调用方法的地方没有对这种可能出现的异常进行处理,那么程序就会终止。所以,要对异常进行捕获操作,正如之前的字符串转数字的方法一样。

浅谈Java异常的分类与处理

根据经验,程序中应该捕获那些知道如何处理的异常,把“职责”外的异常,交给方法的调用者去处理。下面是一个异常捕获流程的示例代码:

浅谈Java异常的分类与处理

在上述代码中,① 中进行操作,捕获了 Exeptionx 或者 Exceptiony 时,② 进行异常处理;捕获了 Exception1 时, ③ 把该异常包装;捕获了 Exception 2 时,④ 直接抛出异常;无论有无异常发生,⑤ 都会执行。

上面的代码还有一个问题,就是 finally 代码中包含返回值。尚学堂•百战程序员陈老师指出有以下规则:try 代码块中包含 return 语句,finally 语句中的代码也会被执行;若 finally 中也包含 return 语句,则会替代 try 中的语句。使用异常的技巧:不要过分细分异常,能用一个 try 块处理的尽量用一个,然后按层次捕获异常,下面的代码是被建议的:

浅谈Java异常的分类与处理

适当地转化异常,如:可以把一个 NumberFormatException 转化成自定义的异常,遇到异常情况,可以更加严格一点。如:抛出 EmptyStackException 比 NullPointerException 更加语义化,学会把异常传递,即:“早抛出,晚捕获”。

浅谈Java异常的分类与处理


分享到:


相關文章: