【问题标题】:Return type with try-catch-finally [duplicate]带有try-catch-finally的返回类型[重复]
【发布时间】:2013-08-10 06:10:00
【问题描述】:

我试过下面的代码sn-p:

private Integer getnumber() {
    Integer i = null;
    try {
        i = new Integer(5);
        return i;
    } catch(Exception e) {
        return 0;
    } finally {
        i = new Integer(7);
    }
}

此方法返回 5 而不是 7。

为什么它返回 5 而不是 7?

提前致谢。

【问题讨论】:

  • 非常简短的回答“当你说 return i 时,i 的值已经在堆栈中更新了”,所以当你稍后更新它时它不会更新
  • @Algorithmist 这是正确的,返回值已经在堆栈中,以后更改值不会影响。将其移至答案。
  • @user2669894,你的问题在这里有很详细的解释,stackoverflow.com/questions/8864230/…,请查收。

标签: java


【解决方案1】:

发生这种情况是因为try..catch..finallyfinally 块在try..catch 中的代码完成之后运行(无论成功与否);对于您的代码,这是发生 return i 的时间。

由于这种行为,i 的值已经被放入方法的返回变量中,然后再分配新值 7 给它。以下将起作用:

private Integer getnumber(){
  Integer i = null;
  try {
    i = new Integer(5);
  }
  catch(Exception e){
    i = new Integer(0);
  }
  finally{
    i = new Integer(7);
  }
  return i;
}

【讨论】:

    【解决方案2】:

    finally 中为您分配了值,在此之前您在try 中返回

    finally中的代码总是执行,但是你已经返回了try中的值

    【讨论】:

      【解决方案3】:

      finally 中,您正在分配值,但该值之前在try 块中返回

      【讨论】:

        【解决方案4】:

        返回值为5,因为return 发生在finally 块执行之前。

        【讨论】:

          【解决方案5】:

          这是因为return语句在finally执行之前执行,而在return语句执行时i的值为5。 要验证这一点,您可以这样做

          private Integer getnumber(){
          Integer i = null;
          try{
             i = new Integer(5);
             return i;
          }catch(Exception e){return 0;}
          finally{
            i = new Integer(7);
            System.out.println(i);
          }
          }
          

          这将打印7,因为finally 块确实执行,但只是在return 语句之后执行。

          【讨论】:

          • 这是错误的,即使try中有return也会调用finally。
          • 我的意思是返回 i 的值,然后执行 finally 块
          • 您可以检查打印的值是来自 finally 块的 7,但实际返回的值是 5
          • @JunedAhsan 答案是正确的。只是措辞混乱。
          • @Prasad Kharkar,您仍然错误地说“返回 i 的值,然后最终执行块”。 finally 将在 return 语句之后执行,但 return 不会被压出堆栈,直到 finally 完成。
          猜你喜欢
          • 2016-03-28
          • 2013-11-22
          • 2014-04-27
          • 2015-02-16
          • 2021-05-30
          • 2018-11-05
          • 2013-02-19
          • 1970-01-01
          • 2011-11-04
          相关资源
          最近更新 更多