Java 最后,你不总是打电话吗?
如果下面的代码是从IDE或命令行运行的,然后停止:Java 最后,你不总是打电话吗?,java,finally,Java,Finally,如果下面的代码是从IDE或命令行运行的,然后停止: 从eclipse停止其执行(红色按钮) 按CTRL+C(命令行) 自然地(通过用for循环替换while(true)循环 从不执行finally子句(“finally”从不打印) 引述: 如果try块的执行正常完成,则 执行块,然后有一个选项: 有什么见解吗 编辑 哎呀,糟糕的是,一个有限for循环导致调用finally子句。我还没有注意到单元测试中的跟踪。因此,它们现在是毫无疑问的。执行永远不会离开while循环。如果你“按红色按钮”执行
- 从eclipse停止其执行(红色按钮)
- 按CTRL+C(命令行)
- 自然地(通过用for循环替换while(true)循环
如果try块的执行正常完成,则 执行块,然后有一个选项: 有什么见解吗 编辑
哎呀,糟糕的是,一个有限for循环导致调用finally子句。我还没有注意到单元测试中的跟踪。因此,它们现在是毫无疑问的。执行永远不会离开while循环。如果你“按红色按钮”执行,它会终止整个过程,因此以后就没有其他代码能够执行了(除非它是JVM的关闭挂钩)
- 从eclipse停止其执行(红色按钮)
- 按CTRL+C(命令行)
- 自然地(通过用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
- 系统级关闭或用户注销
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;
}