-1

我对 Java Exceptions 有基本的怀疑

即,所有已检查的异常都从Exception类扩展,未经检查的异常从RuntimeException. 但运行时异常也从Exception.

但是为什么要传播try...catch带有已检查Exceptions但不在未检查异常中的块?

4

3 回答 3

0

我想你是在问,“我怎么能抓住Exception但不能RuntimeException

您可能不应该尝试这样做。您应该尽可能捕获特定类型的异常。如果您需要处理所有错误,那么您应该捕获Exception并捕获所有错误。*

您很少愿意这样做,catch (NullPointerException)因为如果您知道可以拥有 anull那么您应该检查它。如果您的代码导致NullPointerException或者ArrayOutOfBoundsException您应该修复代码,以便它不再抛出这些。

此代码应向您展示如何执行您所要求的操作:

public static void throwSomething(Exception throwMe)
{
    try {
        throw throwMe;
    }
    catch(Exception ex) {

        // Check if the object is a RuntimeException
        if(ex instanceof RuntimeException) {
            // Throw the same object again.
            // Cast to RuntimeException so the compiler will not
            // require "throws Exception" on this method.
            throw (RuntimeException) ex;
        }

        System.out.println("Caught an instance of a " +
                ex.getClass().toString());
    }
}

*实际上,catch(Throwable)将捕获包括Errors 在内的所有内容。

于 2012-05-03T19:19:24.350 回答
0

通常,您应该catch为要处理的每种特定类型的异常添加不同的块。如果您正在尝试处理(通过重新抛出)已检查的异常,那么您应该知道要重新抛出哪种类型的异常——只需添加一个catch块来重新抛出每种异常类型。

于 2012-05-03T18:49:50.850 回答
0

最简单的方法是这样的:

try { 
    //do stuff
} catch(RuntimeException e) {
    throw e;
} catch(SpecificCheckedException e) {
    //handle
} catch(Exception e) {
    //handle
}
于 2012-05-03T19:48:59.510 回答