是否可以在不捕获异常的情况下抛出异常?
实施例
public void foo() throws SomeException{
// ....
if (somethingCatestrophic) throw new SomeException();
// ....
}
现在我想调用foo,但是不想捕获任何错误,因为在运行时永远不会抛出异常(除非有错误)
答案 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());
}