Java:checked vs unchecked exception说明

问题:

我已经阅读了StackOverFlow上有关检查和未检查异常的多个帖子。我老实说还不太清楚如何正确使用它们。
约书亚布洛赫在“Effective Java”中说

对可恢复条件使用检查的异常和编程错误的运行时异常(第2版中的项目58)

我们来看看我是否正确理解。
这是我对一个检查异常的理解:

try{
    String userInput = //read in user input
    Long id = Long.parseLong(userInput);
}catch(NumberFormatException e){
    id = 0; //recover the situation by setting the id to 0
}

 上述是否考虑了检查异常?
 2. RuntimeException是否被检查异常?
这是我对一个未经检查的异常的理解:

try{
    File file = new File("my/file/path");
    FileInputStream fis = new FileInputStream(file);   
}catch(FileNotFoundException e){

//3. What should I do here?
    //Should I "throw new FileNotFoundException("File not found");"?
    //Should I log?
    //Or should I System.exit(0);?
}

 现在,cannt上面的代码也是一个被检查的异常?我可以尝试恢复这样的情况吗?我可以吗?(注意:我的第三个问题在上面的catch内)

try{
    String filePath = //read in from user input file path
    File file = new File(filePath);
    FileInputStream fis = new FileInputStream(file);   
}catch(FileNotFoundException e){
    //Kindly prompt the user an error message
    //Somehow ask the user to re-enter the file path.
}

 为什么人们这样做?

public void someMethod throws Exception{

}

为什么他们让异常起泡?是不是更好地处理错误?为什么起泡?
 编辑:我应该用正确的异常来冒泡,或者使用异常来掩饰它吗?
 以下是我的读物
 In Java, when should I create a checked exception, and when should it be a runtime exception?
 When to choose checked and unchecked exceptions

回答:

许多人说,检查的异常(即你应该明确地捕获或重新抛出的这些异常)不应该被使用。他们在C#中被淘汰,大多数语言都没有。所以你可以总是抛出RuntimeException的子类(未检查的异常)
但是,我认为检查的异常是有用的 – 当您想强制API的用户考虑如何处理异常情况(如果可以恢复)时使用它们。只是检查的异常在Java平台中被过度使用,这使得人们讨厌他们。
 Here’s my extended view on the topic
至于具体问题:

  1.  是个
    未选中号码NumberFormatException(=是RuntimeException的子类)。为什么?我不知道。 (但应该有一种方法isValidInteger(..)
  2.  
    对,就是这样。
  3.  我该怎么办?
    这取决于这个代码的位置和你想要发生的事情。如果它在UI层 – 抓住它并显示警告;如果它在服务层 – 不要抓住它 – 让它泡沫。只是不要吞下这个例外。如果在大多数情况下发生异常,您应该选择以下之一:
     

    • log it and return
    • rethrow it (declare it to be thrown by the method)
    • construct a new exception by passing the current one in constructor
  4.  现在,上面的代码也不能被检查异常吗?我可以尝试恢复这样的情况吗?我可以吗?
    可以一直但是,没有什么可以阻止你捕捉未检查的异常
  5.  为什么人们加班
    大多数情况下,因为人们懒惰去考虑要抓住什么以及如何去重新思考。投掷Exception是不好的做法,应该避免。

唉,没有一个规则可以让你确定何时捕获,何时重新启动,何时使用检查和何时使用未经检查的异常。我同意这会造成很多混乱和很多坏的代码。一般原则由布洛赫(你引用了它的一部分)来表述。而且一般的原则是将一个异常重新抛出到可以处理它的层上。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Java: checked vs unchecked exception explanation

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

+ 55 = 62