由 ChatGPT 生成的文章摘要
编写 Java 程序时经常遇到烦人的必检异常。在一些情况下,我们需要在不能抛出必检异常的环境下抛出异常,这时我们可以使用工具类 Exceptions.throwExceptionSneakily(Throwable)。通过编写一个特定方法,我们可以在必检异常不可抛出的情况下实现抛出异常的目的。这个工具类可以帮助开发者解决在特定环境下抛出必检异常的问题。同时,更好的解决方法是使用支持 JVM 的新一代编程语言,如 Kotlin。
编写 Java
程序时经常遇到烦人的必检异常。必检异常在初衷上是好的,但是在工程中它常常带来许多麻烦。
例如,在一些不能抛出异常的环境下(如 JDK
的一些函数式接口配合流使用时)代码需要抛出必检异常,便只能包装成一种非必检异常(如 NestedException
)再次抛出。但把异常包装成另一种类型,常常引来新的麻烦。
为了在不能抛出必检异常的环境下抛出必检异常,只需要编写如下工具类:
public class Exceptions {
public static void throwExceptionSneakily(Throwable exception) {
Objects.requireNonNull(t, "Exception is null!");
doThrowExceptionSneakily(t);
}
@SuppressWarnings("unchecked")
private static <T extends Throwable> void doThrowExceptionSneakily(Throwable t) throws T {
throw (T)t;
}
}
多编写一个
#doThrowExceptionSneakily(Throwable)
方法的原因是避免出现Unexpected VM Exception like 'java.lang.NullPointerException' might be ignored in catch block
的警告。
通过这一工具便可以使用 Exceptions.throwExceptionSneakily(Throwable)
抛出必检异常了。开发者有义务仅在内部使用这一 API,或在对外开放 API 中标注相关情况,以免造成困扰。
更好的办法是使用 Kotlin
之类的支持 JVM 的新一代编程语言。