Java 最后,你不总是打电话吗?

Java 最后,你不总是打电话吗?,java,finally,Java,Finally,如果下面的代码是从IDE或命令行运行的,然后停止: 从eclipse停止其执行(红色按钮) 按CTRL+C(命令行) 自然地(通过用for循环替换while(true)循环 从不执行finally子句(“finally”从不打印) 引述: 如果try块的执行正常完成,则 执行块,然后有一个选项: 有什么见解吗 编辑 哎呀,糟糕的是,一个有限for循环导致调用finally子句。我还没有注意到单元测试中的跟踪。因此,它们现在是毫无疑问的。执行永远不会离开while循环。如果你“按红色按钮”执行

如果下面的代码是从IDE或命令行运行的,然后停止:

  • 从eclipse停止其执行(红色按钮)
  • 按CTRL+C(命令行)
  • 自然地(通过用for循环替换while(true)循环
从不执行finally子句(“finally”从不打印)

引述:


如果try块的执行正常完成,则 执行块,然后有一个选项:

有什么见解吗

编辑


哎呀,糟糕的是,一个有限for循环导致调用finally子句。我还没有注意到单元测试中的跟踪。因此,它们现在是毫无疑问的。

执行永远不会离开while循环。如果你“按红色按钮”执行,它会终止整个过程,因此以后就没有其他代码能够执行了(除非它是JVM的关闭挂钩)

  • 从eclipse停止其执行(红色按钮)
  • 按CTRL+C(命令行)
在这些情况下,终止JVM,因此try块不会“正常”完成。没有JVM,就没有Java字节码的解释

  • 自然地(通过用for循环替换while(true)循环

不确定这里发生了什么。如果for循环是可终止的(不是无止境的循环),这应该可以工作。请发布您的代码。

最终块将始终执行,除非您通过程序调用system.exit()。这并不意味着当您强制停止完全关闭jvm的应用程序时,它将被调用。

从eclipse停止其执行(红色按钮) 按CTRL+C(命令行)

您正在终止进程,之后不会执行任何操作

通过用for循环替换while(true)循环,这将最终达到

即使有异常,也会触发finally块

    try{
        for(int i = 0; i < 10; i++);
        throw new RuntimeException("Ex");
    }catch(Throwable e){
        System.out.println("thrown");
    }finally{
        System.out.println("finally");
    }
最后打印,然后应用程序接收RuntimeException

另一种完全终止进程的方法是调用System.exit,它不会进一步执行任何代码(又名:other code and your finally)


这不会打印任何内容。

如果我错了,请纠正我,您是说当您中断程序时finally块没有运行?如果是,则您期望finally块出现错误行为。finally将在代码正常运行时运行。例如,当尝试完成时(成功或有错误)。您正在停止该程序,在这种情况下,其他操作将不会继续。最终是错误处理的一部分。停止程序不是错误处理,lol。

您所做的是在进程完成之前终止进程

您可以使用
shutdownhook
处理以下场景:

  • 因为它的所有线程都已完成执行
  • 由于对System.exit()的调用
  • 因为用户点击了CNTRL-C
  • 系统级关闭或用户注销
e、 g.下文

package com.test;

public class Test {
    public static void main(String[] args) {

        Test test = new Test();
        test.attachShutDownHook();
        try {
            while (true) {
                Thread.sleep(1000);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            System.out.println("Finally");
        }
    }

    public void attachShutDownHook() {
        Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
            public void run() {
                System.out.println("Inside Add Shutdown Hook");
            }
        });
        System.out.println("Shut Down Hook Attached.");
    }
}

最后
只有在出现异常或程序正常终止时才会被调用。

这是一个无限循环。您应该设置一个断点

public class Test {
  public static void main(String[] args) {
    try {
        while (true) {
            Thread.sleep(1000);
            break; //Added
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        System.out.println("Finally");
    }
  }
}
或者可以使用标志设置循环何时结束

boolean myFlag = true;
while(myFlag) {
    doSomething();
    myFlag = false;
}

如果try块的执行正常完成。我还怀疑您的上一个语句是否为true(即for循环已完成)。CTRL+C是否为“正常”完成?您正在强制停止进程,这不是正常情况。基本上,您所做的是从墙上的插座拔下电源插头,您希望您的windows桌面客户端询问您是否确实要关闭此计算机…此链接将对您有所帮助。哈哈,我几天前读到了“finaly”语句…我假设他写了类似于for(int I=0;I>0;I++)的东西,这与while(true)是JLS中的某个标准化的东西吗?我的意思是,在调用System.exit(0)之后,最终不必执行?@DmitryBundin AFAIK,是的,它是标准化的。我猜在JLS的某个地方。这是你不应该调用System.exit的原因之一,除非在你设置返回值的主要方法中。同意。我只是想展示什么对他有意义。也许这就是他在寻找的。
package com.test;

public class Test {
    public static void main(String[] args) {

        Test test = new Test();
        test.attachShutDownHook();
        try {
            while (true) {
                Thread.sleep(1000);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            System.out.println("Finally");
        }
    }

    public void attachShutDownHook() {
        Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
            public void run() {
                System.out.println("Inside Add Shutdown Hook");
            }
        });
        System.out.println("Shut Down Hook Attached.");
    }
}
public class Test {
  public static void main(String[] args) {
    try {
        while (true) {
            Thread.sleep(1000);
            break; //Added
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        System.out.println("Finally");
    }
  }
}
boolean myFlag = true;
while(myFlag) {
    doSomething();
    myFlag = false;
}