【问题标题】:Try/Finally - Job Interview [duplicate]尝试/最终 - 工作面试 [重复]
【发布时间】:2015-01-17 10:36:50
【问题描述】:

我遇到了几个在工作面试中经常被问到的问题(至少在我的国家 - 瑞士),我对一段应该很棘手的代码块的输出非常不确定。很高兴听到您认为正确答案是什么。

在这里:

 public class LanguageTest12 {

   public static void main(String... args){
       System.out.println(foo());
   }

   private static int foo() {
      int a = 1, b = 2;
      try {
          return a+b;
      } finally {
          a = 10;
          b = 20;
          return a+b;
     }
   }
 }

但我知道答案必须是这三种可能性之一:

  1. 3
  2. 30
  3. 33

(PS:以防万一有人感兴趣,这里是所有问题:http://se.inf.ethz.ch/courses/2014a_spring/JavaCSharp/exercise_sessions/ExerciseSession5.pdf)

【问题讨论】:

  • 不,我也不想要,我只是在运行之前寻找解释:)
  • 这里可以看到其他解释:stackoverflow.com/questions/4559661/…
  • 正确的答案是,您的 IDE 和/或 FindBugs 会警告您在 finally 块中返回,您修复代码,并且不再编写这样的代码。
  • 有一个与此类似但使用字符串缓冲区的技巧问题。你可能也想学那个

标签: java


【解决方案1】:

finally 块用于必须始终运行的代码,无论是否发生错误情况(异常)。

finally 块中的代码在 try 块完成后运行,如果发生捕获的异常,则在相应的 catch 块完成后运行。它应该始终运行,即使在 try 或 catch 块中发生未捕获的异常(除非您在 try 块中有 System.exit(0),因为它会在转到finally 块)。

所以你的答案是 2. 30

【讨论】:

  • try { System.exit(0); } finally { System.out.println("almost always"); }
  • @ElliottFrisch 这非常迂腐。根据定义System.exit(int) 不会返回。给定的是,在它之后的指令永远不会执行。假设 JVM 继续执行到相关 try 和 catch 块的末尾,finally 块将始终运行。
  • 谢谢 ELliott 我忘了做这个笔记。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-17
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 2017-11-05
  • 2016-01-10
相关资源
最近更新 更多