是否有可能在Java中构造一段代码,使假设的Java .lang. chucknorrisexception无法捕获?
我想到的是使用拦截器或面向方面的编程。
是否有可能在Java中构造一段代码,使假设的Java .lang. chucknorrisexception无法捕获?
我想到的是使用拦截器或面向方面的编程。
当前回答
是否有可能在java中构造一段代码,使假设的java.lang. chucknorrisexception无法捕获?
是的,这就是答案:设计你的java.lang.ChuckNorrisException,使它不是java.lang.Throwable的实例。为什么?从定义上讲,不可抛出的对象是不可捕获的,因为你永远不能捕获永远不能抛出的东西。
其他回答
是否有可能在java中构造一段代码,使假设的java.lang. chucknorrisexception无法捕获?
是的,这就是答案:设计你的java.lang.ChuckNorrisException,使它不是java.lang.Throwable的实例。为什么?从定义上讲,不可抛出的对象是不可捕获的,因为你永远不能捕获永远不能抛出的东西。
这个主题的另一个变体是,您可以从Java代码抛出未声明的受控异常。由于它没有在方法签名中声明,所以编译器不会让您捕获异常本身,尽管您可以将其作为java.lang.Exception捕获。
这里有一个帮助类,它允许你抛出任何东西,无论是否声明:
public class SneakyThrow {
public static RuntimeException sneak(Throwable t) {
throw SneakyThrow.<RuntimeException> throwGivenThrowable(t);
}
private static <T extends Throwable> RuntimeException throwGivenThrowable(Throwable t) throws T {
throw (T) t;
}
}
现在扔SneakyThrow。溜(新ChuckNorrisException ());抛出ChuckNorrisException,但编译器抱怨
try {
throw SneakyThrow.sneak(new ChuckNorrisException());
} catch (ChuckNorrisException e) {
}
如果ChuckNorrisException是一个受控异常,则捕获没有抛出的异常。
在构造函数中,可以启动一个反复调用originalThread的线程。停止(ChuckNorisException.this)
线程可以重复捕获异常,但会一直抛出异常,直到异常死亡。
Java中唯一的chucknorrisexception应该是OutOfMemoryError和StackOverflowError。
实际上,您可以“捕获”它们,这意味着在抛出异常时将执行catch(OutOfMemoryError ex),但该块将自动将异常重新抛出给调用者。
我不认为公共类ChuckNorrisError extends Error可以解决这个问题,但是你可以尝试一下。我没有找到关于扩展错误的文档
不。Java中的所有异常都必须成为Java .lang的子类。虽然这可能不是一个好的实践,但你可以像这样捕获每种类型的异常:
try {
//Stuff
} catch ( Throwable T ){
//Doesn't matter what it was, I caught it.
}
有关更多信息,请参阅java.lang.Throwable文档。
如果您试图避免检查异常(必须显式处理的异常),那么您将希望继承Error或RuntimeException类。