很奇妙啊。
package t055;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,problem,end of method这三个字符串,而且任意一种顺序都有可能。可能的有:End of method.
run.
Exception in thread "Thread-0" java.lang.RuntimeException: Problem
at t055.Threads2.run(Threads2.java:7)
at java.lang.Thread.run(Thread.java:619)



Exception in thread "Thread-0" End of method.
run.
java.lang.RuntimeException: Problem
at t055.Threads2.run(Threads2.java:7)
at java.lang.Thread.run(Thread.java:619)




End of method.Exception in thread "Thread-0" java.lang.RuntimeException: Problem
at t055.Threads2.run(Threads2.java:7)
at java.lang.Thread.run(Thread.java:619)run.
Exception in thread "Thread-0" java.lang.RuntimeException: Problem
at t055.Threads2.run(Threads2.java:7)
at java.lang.Thread.run(Thread.java:619)
End of method.
run.我真是奇了怪了,run居然有可能在处理异常之后输出,这是怎么回事,谁能解释一下。

解决方案 »

  1.   

    而且,throw这个运行时异常必须放在结尾,才有这个run在后面输出的效果,如果改成下面这样,则run就不会输出了,这又是一个奇怪的地方:
    if (2>1){
    throw new RuntimeException("Problem");
    }
    System.out.println("run.");
      

  2.   

    把Exception throw到jvm,是用System.err来打印的,而你其它的是用System.out打印的,虽然都是标准输出流和标准错误流都是控制台,但是它们的打印顺序是不确定的.#2的代码,System.out.println("run.");这句是必然不能执行的,因为方法已经抛出一个异常,但方法里面没有对这个异常进行处理,所以程序的执行马上跳出当前方法,返回到上一级方法调用此方法的地方去.