Java无限循环以一种不可能的方式终止
我有如下代码:Java无限循环以一种不可能的方式终止,java,loops,jvm,jvm-hotspot,Java,Loops,Jvm,Jvm Hotspot,我有如下代码: @Override protected Void doInBackground() throws Exception { try { while(true) cpu.step(); } catch(Throwable t) { throw new RuntimeException(t); } finally { System.out.println("E
@Override
protected Void doInBackground() throws Exception {
try {
while(true) cpu.step();
} catch(Throwable t) {
throw new RuntimeException(t);
} finally {
System.out.println("EmulationWorked task completed");
}
}
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)
这个循环应该总是通过抛出一个异常来退出,但是在我的例子中,我看到控件到达println
语句时没有这样做
我的Java/JVM版本如下:
@Override
protected Void doInBackground() throws Exception {
try {
while(true) cpu.step();
} catch(Throwable t) {
throw new RuntimeException(t);
} finally {
System.out.println("EmulationWorked task completed");
}
}
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)
这个问题与我之前发布的另一个问题中的一个问题有关:
这是某种已知的JVM错误吗?我错了。断点确实在catch块上断开了。由于此异常发生在后台SwingWorker线程中,并且我对最终结果不感兴趣(不在done方法中调用get),因此该异常被Swing吞没。请阅读
finally
的功能。该方法应通过始终抛出异常来完成,这在我的特定情况下不会发生。我知道finally块总是会执行的。你怎么知道它不会在这种特殊情况下发生呢?因为,如果我在catch块(捕捉所有可丢弃的对象)上放置一个断点,它不会中断。但是,finally块上的语句处的断点确实会中断。还要注意,捕获所有可丢弃项并在运行时异常中进行包装是多余的,因为SwingWorker已经这样做了。doInBackground()中抛出的任何异常都会自动包装在ExecutionException中,可以通过在done()中调用get()来捕获。