问题:理解Java里面的必检异常和非必检异常
Joshua Bloch在"Effective Java"里面说过
在可恢复的条件下和编程错误导致的运行时错误时,使用必检异常(第二版的第52页)
让我们来看一下我对这个的正确理解吧
下面是我对必检异常的理解
try{
String userInput = //read in user input
Long id = Long.parseLong(userInput);
}catch(NumberFormatException e){
id = 0; //通过设置ID为0,来恢复这种情况
}
1.上面的代码是否能被看作必检异常
2.运行时异常是一个非必检异常吗?
下面是我对非必检异常的一些理解
try{
File file = new File("my/file/path");
FileInputStream fis = new FileInputStream(file);
}catch(FileNotFoundException e){
//3. 这里我应该干什么
//我应该 "throw new FileNotFoundException("File not found");"?
//应该写日志吗?
//或者应该 System.exit(0);?
}
- 现在看来,上面的代码也不可能是一个必检的异常了?我可以尝试像这样恢复吗?(注意:我的第三个问题在上面代码的catch那里)
try{
String filePath = //read in from user input file path
File file = new File(filePath);
FileInputStream fis = new FileInputStream(file);
}catch(FileNotFoundException e){
//友好地提升用户一个错误信息
//以某种方式要求用户重新输入路径
}
- 为什么我们需要这样做?
public void someMethod throws Exception{
}
为什么要把这个异常抛出?直接处理不是更快更好吗?
6.我应该直接抛出确切的异常还是使用Exception去覆盖掉他
回答一
是不是必检异常和你是否捕捉和你在捕获异常的代码块里面干了什么无关。它是异常类的一种属性。任何异常都是Exception类的一个子类(除了运行时异常)并且它的子类都是必检异常
Java的编译器强制要求你捕获异常或者在方法签名那个声明。它们可以用来提高程序的安全性,但是大部分人认为它不会带来程序设计上的问题
为什么要把这个异常抛出?直接处理不是更快更好吗?
因为这是异常的完整内容。如果没有这种可能性,你就不需要这些异常了。它们能够让你在你选择的层级去处理异常,而不是强制让你在异常发生的底层级的方法里处理这些异常
文章翻译自Stack Overflow:https://stackoverflow.com/questions/6115896/understanding-checked-vs-unchecked-exceptions-in-java