技术开发 频道

J2EE项目异常处理

    2. Checked 异常 还是 unChecked 异常?
    Java异常分为两大类:checked 异常和unChecked 异常。所有继承Java.lang.Exception 的异常都属于checked异常。所有继承Java.lang.RuntimeException的异常都属于unChecked异常。
    当一个方法去调用一个可能抛出checked异常的方法,必须通过try…catch块对异常进行捕获进行处理或者重新抛出。
    我们看看Connection接口的createStatement()方法的声明。
     public Statement createStatement() throws SQLException;

     SQLException是checked异常。当调用createStatement方法时,Java强制调用者必须对SQLException进行捕获处理。

public String getPassword(String userId)...{
try...{
……
Statement s = con.createStatement();
……
Catch(SQLException sqlEx)...{
……
}
……
}
    或者

public String getPassword(String userId)throws SQLException...{
Statement s = con.createStatement();
}
    (当然,像Connection,Satement这些资源是需要及时关闭的,这里仅是为了说明checked 异常必须强制调用者进行捕获或继续抛出)

    unChecked异常也称为运行时异常,通常RuntimeException都表示用户无法恢复的异常,如无法获得数据库连接,不能打开文件等。虽然用户也可以像处理checked异常一样捕获unChecked异常。但是如果调用者并没有去捕获unChecked异常时,编译器并不会强制你那么做。

    比如一个把字符转换为整型数值的代码如下:


String str = “123”;
int value = Integer.parseInt(str);
    parseInt的方法签名为:
    public static int parseInt(String s) throws NumberFormatException

    当传入的参数不能转换成相应的整数时,将会抛出NumberFormatException。因为NumberFormatException扩展于 RuntimeException,是unChecked异常。所以调用parseInt方法时无需要try…catch

    因为Java不强制调用者对unChecked异常进行捕获或往上抛出。所以程序员总是喜欢抛出unChecked异常。或者当需要一个新的异常类时,总是习惯的从RuntimeException扩展。当你去调用它些方法时,如果没有相应的catch块,编译器也总是让你通过,同时你也根本无需要去了解这个方法倒底会抛出什么异常。看起来这似乎倒是一个很好的办法,但是这样做却是远离了Java异常处理的真实意图。并且对调用你这个类的程序员带来误导,因为调用者根本不知道需要在什么情况下处理异常。而checked异常可以明确的告诉调用者,调用这个类需要处理什么异常。如果调用者不去处理,编译器都会提示并且是无法编译通过的。当然怎么处理是由调用者自己去决定的。

    所以Java推荐人们在应用代码中应该使用checked异常。就像我们在上节提到运用异常的好外在于可以强制调用者必须对将会产生的异常进行处理。包括在《Java Tutorial》等Java官方文档中都把checked异常作为标准用法。

0
相关文章