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

Java:尝试最后阻止执行

欧阳乐生
2023-03-14
问题内容

return;try块中存在时,我对try-
finally执行感到困惑。据我了解,finally块将始终执行,即在返回调用方法之前。在考虑以下简单代码时:

public class TryCatchTest {
    public static void main(String[] args){
        System.out.println(test());
    }
    static int test(){
        int x = 1;
        try{
            return x;
        }
        finally{
            x = x + 1;
        }
    }
}

实际打印的结果为1。这是否意味着不执行finally块?有人可以帮我吗?


问题答案:

try块返回时,返回值存储在该方法的堆栈帧中。之后,将执行finally块。

更改finally块中的值不会更改堆栈中已存在的值。但是,如果您从finally块再次返回,则堆栈上的返回值将被覆盖,并且x将返回新值。

如果打印xinfinally块中的值,您将知道它已执行,并且x将打印出值。

static int test(){
    int x = 1;
    try{
        return x;
    }
    finally{
        x = x + 1;
        System.out.println(x);  // Prints new value of x
    }
}

注意: 如果返回参考值,则参考值存储在堆栈中。在这种情况下,您可以使用该引用来更改对象的值。

StringBuilder builder = new StringBuilder("");
try {
    builder.append("Rohit ");
    return builder;

} finally {
    // Here you are changing the object pointed to by the reference
    builder.append("Jain");  // Return value will be `Rohit Jain`

    // However this will not nullify the return value. 
    // The value returned will still be `Rohit Jain`
    builder =  null;
}

建议阅读:

  • JVM规范-框架


 类似资料:
  • 问题内容: 我想在finally块中关闭流,但是它抛出一个,因此看来我必须在块中嵌套另一个块才能关闭流。这是正确的方法吗?似乎有点笨拙。 这是代码: 问题答案: 似乎有点笨拙。 它是。至少java7尝试使用资源可以解决该问题。 在java7之前,您可以创建一个吞咽它的函数: 或将try …最终放入try catch中: 它比较冗长,并且finally中的异常会在try中隐藏一个,但从语义上讲它更接

  • 在 中,尝试捕获最终阻止的工作原理是什么? 所以如果有例外,我知道它会跳到捕获块,然后跳到最后的块。 但是如果没有错误,catch块不会运行,但是finally块会运行吗?

  • 问题内容: 看一下以下两种方法: 清楚地运行会导致,但不会运行(该程序似乎无限期地运行)。 这是为什么? 问题答案: 它不会永远运行。每次堆栈溢出都会导致代码移至finally块。问题在于这将需要非常,非常长的时间。时间顺序为O(2 ^ N),其中N是最大堆栈深度。 想象最大深度为5 要使每个级别进入finally块都需要两倍的时间,而堆栈深度可能是10,000或更大。如果您每秒可以进行10,00

  • 在我的Espresso测试执行和AlertDialog会被提示并等待用户响应。Espresso测试只有在我按下“Accept”按钮但我想测试代替用户执行此事件时才会继续。 我注意到我的线程选项卡上有以下状态

  • Rspec尝试在运行任何规范文件或整个测试套件的末尾运行测试::单元测试。它仍然可以,因为我没有任何测试单元测试文件,但它尝试将给定给rspec的命令行选项传递给test::unit,结果是 如何阻止rspec运行测试单元测试? 我正在使用的测试gem版本是

  • 我已经为一个服务实现了socket.io,然后删除了它。但是,我仍然有客户机向endpoint/socket.io发出初始连接请求,而endpoint/socket.io已经不存在了。使用各种http状态代码进行响应似乎并不重要。 是否有方法阻止客户端尝试连接?我每分钟收到几千个请求。