需要无法访问的声明说明

时间:2014-08-02 20:46:05

标签: java

我正准备参加OCA Java考试并且错误地提出了这个问题。我不明白为什么return语句无法访问。我的想法是,即使抛出异常,它也会被捕获,执行finally块中的语句然后执行return语句,或者如果抛出异常,线程是否不执行return语句?更一般地说,有人可以解释在触发异常的情况下发生的事情的规则,以及在finally块执行与否之后的情况。对于一些问题,我得到的是正确的,对于其他人我不是这样,我不清楚这里的确切编译规则。

public float parseFloat(String s){
   float f = 0.0f;
   try{
      f = Float.valueOf(s).floatValue();
      return f ;
   }
   catch(NumberFormatException nfe){
      System.out.println("Invalid input " + s);
      f = Float.NaN ;
      return f;
   }
   finally { System.out.println("finally");  }
   return f ;
}

2 个答案:

答案 0 :(得分:3)

  1. 如果发生异常,代码会立即退出
  2. 然后检查,如果有匹配的catch语句,如果有,那么它的代码就会运行
  3. 无论 try catch 块内部发生了什么,最终部分都会一直运行。
  4. 如果catch块没有返回或者自己抛出异常,则try / catch / finally之后的代码继续运行。
  5. 这在您的代码中是不可能的,因为在成功的情况下,您的try块会返回,并且在失败的情况下,您的catch块将返回。
  6. 所以可能有一个理论上的情况,你的代码是有意义的:如果try {}块中的代码会抛出除NumberFormatException之外的任何其他异常。这是唯一可能的,如果它是未经检查的异常(您不需要捕获的异常)。编译器无法知道或检查这一点,因此除非您为其编写第二个catch块,否则不允许使用此类代码。 (如果你现在感到困惑:忘记我说的话,这对你的任务来说并不重要)

    这是一个这样一个案例的样本:

    public float parseFloat(String s){
       float f = 0.0f;
       try{
          SomeOtherClass.doStuffWhichFailsWithRuntimeException();
          return f;
       }
       catch(NumberFormatException nfe){
           // will not run, because the thrown exception is not of type NumberFormatException
       }catch(Exception e){
           // any other failure besides NumberFormatException
           // considered bad practice: If you do not know what fails, do not try to recover from it, it's most likely very bad.
          return f;
       }
       finally { 
          // this will run after the catch block was run
          System.out.println("finally");  
       }
    
       // theoretically reachable, but compiler does not allow it because he cannot check it.
       //return f ;
    }
    

答案 1 :(得分:1)

如果发生异常,则捕获块运行,返回f,最后块运行。 最后一次

  

返回f;

永远不会到达。