SCJP:程序在未捕获的异常后不会终止

时间:2011-04-11 13:50:10

标签: java multithreading scjp

public class Threads2 implements Runnable {

    public void run() {
        System.out.println("run.");
        throw new RuntimeException("Problem");
    }

    public static void main(String[] args) {
        Thread t = new Thread(new Threads2());
        t.start();
        System.out.println("End of method.");
    }
}

我预测输出为

run.
//exception

但它显示输出为,

run
exception
end of method

(或)

run
end of method
exception

我想知道,一旦发生异常,程序将终止,对吗?

6 个答案:

答案 0 :(得分:3)

不,你的程序没有终止,但是线程没有。

当线程抛出未捕获的异常时,它会终止。您的main主题继续运行。

答案 1 :(得分:1)

首先,你得到的输出不是最终结果。在多线程的情况下,它取决于机器。在不同的机器上可能会出现一些不同的输出。

异常时,正在运行的线程执行终止。其他线程继续执行。

答案 2 :(得分:0)

亲自看看。在我的机器上,我得到:

bartek@dragon:~/workspace/sandbox$ java Threads2 
End of method.
run.
Exception in thread "Thread-0" java.lang.RuntimeException: Problem
    at Threads2.run(Threads2.java:5)
    at java.lang.Thread.run(Thread.java:636)

答案 3 :(得分:0)

这是多线程的美妙!!

你编写的每个java程序都有一个运行它的线程,它通常是一个主线程。在您的情况下,您已经创建了自己的线程,其父线程是主线程。当您的子线程抛出异常时,它结束但主线程仍未完成。所以它打印是最后一个语句然后结束。

如果是线程,则无法预测行为[因为它取决于JVM从可运行池中选择项目的策略],因此您看到的顺序在不同的运行中可能会有所不同。

答案 4 :(得分:0)

如果您发现问题,那么您明确地创建了一个 t 主题。当你运行代码时main方法会运行,这里jvm也会为主类创建一个线程。这意味着代码有两个线程。一个是 t ,另一个是主类线程。这里main()线程是父线程, t 线程是子线程。由于子线程中发生异常,它将终止并且父线程将运行。因此输出可能是任何顺序。

此致 詹姆斯

答案 5 :(得分:-1)

不是程序,但是线程终止。主程序继续执行。