我正在阅读有关Java中已检查和未检查的异常的文章,并找到此文章/链接:https : //projectlombok.org/disableCheckedExceptions.html
根据这篇文章,这只是为javac开发的黑客。
考虑下面的代码片段:
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();
}
}
在这里我必须写,public static void main(String args[]) throws IOException
因为我正在尝试打开文件。在这里,“ throws”子句是必须的。没有它,我会得到一个错误。如果我确定要打开的文件的存在怎么办。提到的位置中的iemyfile.txt。在某些时候,您可能会觉得代码不需要检查异常。
Java是否提供了根据需要禁用检查异常的功能?
即使做了很多研究,我也找不到合适的答案。
Java是否提供了根据需要禁用检查异常的功能?
没有官方的设施,但是有一些变通办法可以在需要时使用:
首先,由于有两个检查和未经检查的Java异常,使用unchecked异常可能是一种选择。未检查所有源自RuntimeException的异常:
RuntimeException是在Java虚拟机的正常操作期间可能引发的那些异常的超类。方法不需要在其throws子句中声明可能在方法执行期间抛出但未被捕获的RuntimeException的任何子类。
然后是类型擦除,它允许在不声明它的情况下引发检查异常。
这就是龙目岛用于@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();
}
}
请谨慎使用:
请注意,不可能直接捕获偷偷地抛出的检查类型,因为javac不允许您为try主体中没有方法调用声明为抛出的异常类型编写catch块。
最后,只有编译器关心被检查的异常,它根本不是jvm的一部分。一旦您经过编译器阶段,一切皆有可能。因此,直接编写字节码或使用禁用了检查异常的javac版本会完全绕开它们。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句