是否可以在Java中禁用Checked Exception?

纳维·尼奥

我正在阅读有关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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章