Nav*_*Neo 5 java exception checked-exceptions unchecked-exception
我正在阅读有关Java中已检查和未检查的异常的文章,并找到此文章/链接:https : //projectlombok.org/disableCheckedExceptions.html
根据这篇文章,这只是为javac开发的一种hack。
考虑下面的代码片段:
import java.io.*;
class Example
{
public static void main(String args[]) throws IOException
{
FileInputStream fis = null;
fis = new FileInputStream("myfile.txt");
int k;
while(( k = fis.read() ) != -1)
{
System.out.print((char)k);
}
fis.close();
}
}
Run Code Online (Sandbox Code Playgroud)
在这里我必须写, public static void main(String args[]) throws IOException
因为我正在尝试打开文件。在这里,“ throws”子句是必须的。没有它,我会得到一个错误。如果我确定要打开的文件的存在怎么办。提到的位置中的iemyfile.txt。在某些时候,您可能会觉得代码不需要检查异常。
Java是否提供了根据需要禁用检查异常的功能?
即使做了很多研究,我也找不到合适的答案。
Java 是否提供了根据需要禁用检查异常的功能?
没有官方设施,但有需要时可以使用的解决方法:
首先,由于 java 中同时存在检查异常和非检查异常,因此使用非检查异常可能是一种选择。所有从 RuntimeException 派生的异常都未被检查:
RuntimeException 是 Java 虚拟机正常运行期间可能抛出的异常的超类。方法不需要在其 throws 子句中声明在方法执行期间可能抛出但未被捕获的 RuntimeException 的任何子类。
然后是类型擦除,它允许在不声明的情况下抛出已检查的异常。
这就是 lombok 项目用于@SneakyThrows的内容
import lombok.SneakyThrows;
public class SneakyThrowsExample implements Runnable {
@SneakyThrows(UnsupportedEncodingException.class)
public String utf8ToString(byte[] bytes) {
return new String(bytes, "UTF-8");
}
@SneakyThrows
public void run() {
throw new Throwable();
}
}
Run Code Online (Sandbox Code Playgroud)
谨慎使用:
请注意,不可能直接捕获偷偷抛出的检查类型,因为 javac 不会让您为 try 主体中没有方法调用声明为抛出的异常类型编写 catch 块。
最后,只有编译器关心检查异常,它根本不是 jvm 的一部分。一旦过了编译器阶段,一切皆有可能。因此,直接编写字节码或使用禁用检查异常的 javac 版本完全绕过它们。