java抛出异常没有捕获它?

时间:2011-12-01 23:35:21

标签: java exception-handling

是否可以在不捕获异常的情况下抛出异常?

实施例

public void foo() throws SomeException{
    // ....
    if (somethingCatestrophic) throw new SomeException();
    // ....
}

现在我想调用foo,但是不想捕获任何错误,因为在运行时永远不会抛出异常(除非有错误)

5 个答案:

答案 0 :(得分:32)

除非您正在计划并从本地恢复,否则在这种情况下最好使用未经检查的例外,例如RuntimeException衍生物。

答案 1 :(得分:1)

您可以避免捕获异常,但是如果抛出异常并且您没有捕获它,则程序将停止执行(崩溃)。

无法忽略异常。如果您的应用程序不需要做任何事情来响应给定的异常,那么您只需捕获它,然后什么都不做。

try {
  ...some code that throws an exception...
} catch (SomeException ex) {
  // do nothing
}

注意:这通常被认为是不好的风格,但人们可能会告诉你。经常被引用的原因是,即使您不打算对例外做任何事情,在大多数情况下,您至少应该在某处登录,通知用户,或采取其他适当的操作,具体取决于您的应用程序是什么做,以及首先导致异常的原因。如果您不确定为什么会抛出异常(也许这是一个尚未解决的错误),那么通常您应该至少记录它以便以后能够解决它。

答案 2 :(得分:1)

为什么不在方法中捕获它?

如果异常无关紧要并且不影响程序的任何行为,只需使用try catch block并继续操作。

答案 3 :(得分:0)

如果SomeException是一个已检查的异常,则调用foo()的方法必须捕获该异常并处理它,或者还要声明为抛出SomeException或其父类

如果SomeException是运行时异常,则调用它的方法不需要捕获它。

答案 4 :(得分:0)

有一个窍门,您可以使用泛型。

/**
 * A java syntax glitch to throw any throwable without the need to catch it.
 *
 * @param throwable to be ignite
 * @param <T>       the type of the throwable to trick the compiler that it's the one thrown
 * @throws T exactly the given throwable
 */
public static <T extends Throwable> void ignite(Throwable throwable) throws T {
    Objects.requireNonNull(throwable, "throwable");
    throw (T) throwable;
}

此测试应通过

@Test(expected = IOException.class)
public void ignite() {
    ignite(new IOException());
}