Question 120
Given:
1. public class Threads2 implements Runnable {
2.
3. public void run() {
4. System.out.println(”run.”);
5. throw new RuntimeException(”Problem”);
6. }
7. public static void main(String[] args) {
8. Thread t = new Thread(new Threads2());
9. t.start();
10. System.out.println(”End of method.”);
11. }
12. }
Which two can be results? (Choose two)
A. java.lang.RuntimeException: Problem
B. run.
java.lang.RuntimeException: Problem
C. End of method.
java.lang.RuntimeException: Problem
D. End of method.
run.
java.lang.RuntimeException: Problem
E. run.
java.lang.RuntimeException: Problem
End of method.
这题的正确答案是:D,E。我觉得D还勉强说的过去,最后发现RuntimeException嘛。
可是E呢?RuntimeException之后还能把End of method输出?
这样应该不对的吧?- -

解决方案 »

  1.   

    RuntimeException之后还能把End of method输出? 
    你不能假设throw RuntimeException在End of method之前执行,既然是多线程,这两个执行的顺序是不确定的。
      

  2.   


    我是不能假设,可是E这个答案成立的话只有是throw RuntimeException在End of method之前执行。这里的意思是不是说:一个线程RuntimeException了,另一个线程不受影响,接着跑?程序除了出错线程别的没事儿嘛?^_^
      

  3.   

    5天后我就考SCJP考试了!!!麻烦各位大侠帮忙解决疑惑!!!感激不尽!~~~
      

  4.   

    首先我们要确定
    End of method  这个肯定是要被输出的
    另外,我们要肯定
    run
    java.lang.RuntimeException: Problem 
    这个肯定也是要输出而且顺序是不变的剩下的就是第一个东西和第二个东西哪个先输出的问题了,但是这并不是确定的,也就是说谁先输出都有可能的,所以就是DE了另外再解释一下为什么End of method必定被输出
    这是因为,一个线程中出现runtimeexception只是导致这个线程崩溃,并不对其它线程或主线程造成影响,这也是多线程的一个优势吧
      

  5.   

    正确答案是D、E
    解释如下:
    1. public class Threads2 implements Runnable {
    2.
    3. public void run() {
    4. System.out.println(”run.”);
    5. throw new RuntimeException(”Problem”);
    6. }
    7. public static void main(String[] args) {
    8. Thread t = new Thread(new Threads2());
    9. t.start();                                 //这里启动一个新的线程,和你运行的主线程没有任何关系。也就是说这个线程如果抛出异常,那么不会
                                                    影响主线程。所以正常。
    10. System.out.println(”End of method.”);
    11. }
    12. } 不能依赖于哪一个线程先执行,所以D和E都是正确的。有可能说主线程继续执行,有可能是新启动的线程先执行。