当前位置: 首页 > 面试题库 >

Java在try-catch-finally机制中的返回值

孙京
2023-03-14
问题内容

我刚遇到以下代码:

public class TestFinally {
    public static void main(String[] args) {
        int returnValue = function();

        System.out.println("Return value: " + returnValue);
    }

    public static int function() {
        try {
            return 1;
        } catch (Exception e){
            return 2;
        } finally{
            return 3;
        }
    }
}

毫无疑问,运行此代码将产生“返回值:3”的输出。

但是,我对此感到好奇:

  1. JVM中的内部机制。有谁知道VM是否通过覆盖第一个“ return 1”来实际替换堆栈上的返回值?如果是这样,我在哪里可以找到更多信息。
  2. 我还没有找到以这种方式使用并允许在JVM中实现的final机制中的返回值的用法。如果将此代码构造用作返回错误代码的手段,我认为有更好的方法记录错误或返回这些错误代码。有没有人发现这种构造的用途?

提前谢谢了。

干杯,维尔恩


问题答案:

我在Java语言规范中发现的内容至少定义了您的代码段应返回3。当然,它没有提到JVM应该如何实现这一点,以及人们可以做哪些优化。

14.20.2节定义

如果try块的执行由于其他任何原因R突然完成,则将执行finally块。然后有一个选择:

  1. 如果finally块正常完成,则try语句由于原因R突然完成。
  2. 如果finally块由于原因S突然完成,则try语句由于原因S突然完成(并且原因R被丢弃)。

第14章的开头(更确切地说是14.1节)指定了什么是正常的突然完成。例如return,具有给定值的a是突然完成。

因此,在这种情况下,该finally块会突然完成(原因:return具有给定的值),因此try,由于相同的原因,将突然完成(并返回3)。这是在证实有关return语句段14.17以及

如果对表达式的求值正常完成,产生一个值V,则return语句突然完成,原因是返回值为V的返回值。



 类似资料:
  • 在实际开发中,根据 try catch 语句的执行过程,try 语句块和 catch 语句块有可能不被完全执行,而有些处理代码则要求必须执行。例如,程序在 try 块里打开了一些物理资源(如数据库连接、网络连接和磁盘文件等),这些物理资源都必须显式回收。 Java的垃圾回收机制不会回收任何物理资源,垃圾回收机制只回收堆内存中对象所占用的内存。 所以为了确保一定能回收 try 块中打开的物理资源,异

  • 问题内容: 大家。我有一个关于java中返回值的菜鸟问题。这是我的代码。 Eclipse报告“此方法必须返回long类型的结果”错误。但是我确实在try块中返回了提示。eclipse建议在try / catch块之后添加一个返回值,这会破坏逻辑。你能告诉我这里有什么问题吗?谢谢。 问题答案: 当一个被抛出的返回值是不确定的。引发异常时,控制权立即传递给异常处理程序。在这种情况下,您记录错误。然后控

  • 是否有像java try catch finally这样的linux bash命令?还是linux shell总是在运行?

  • 本文向大家介绍说明PowerShell中的Try / Catch / Finally块,包括了说明PowerShell中的Try / Catch / Finally块的使用技巧和注意事项,需要的朋友参考一下 PowerShell中的Try / Catch块用于处理脚本中产生的错误。具体而言,错误应该是终止错误。在最后在PowerShell中块不是强制性的,每次沿写try / catch语句,但它会

  • 本文向大家介绍try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?相关面试题,主要包含被问及try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?时的应答技巧和注意事项,需要的朋友参考一下 finally 一定会执行,即使是 catch 中 return 了,catch 中的 return