Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java无限循环以一种不可能的方式终止_Java_Loops_Jvm_Jvm Hotspot - Fatal编程技术网

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()来捕获。