日期:2014-05-20  浏览次数:20887 次

同样的代码,运行一次一种结果,怎么回事?
本帖最后由 xingqi10 于 2012-11-12 22:33:16 编辑 package exception;
class MyException2 extends RuntimeException{

public MyException2() {
super();
}

public MyException2(String message) {
super(message);
}


class MyException1 extends Exception{

public MyException1() {
super();
}

public MyException1(String message) {
super(message);
}

}
public class MyExceptionDemo {
public static void divide(int a,int b){
if(b == 0){
throw new MyException2("亲,除数不能为0");
}
}
public static void main(String[] args) {
try{
divide(1,0);
}catch(Exception e){
String msg = e.getMessage();
System.out.println("msg="+msg);
System.out.println("2");
e.printStackTrace();
System.out.println("1");

}
System.out.println("222");
}
}




以上是代码:
运行结果1:
msg=亲,除数不能为0
2
exception.MyException2: 亲,除数不能为01
222

at exception.MyExceptionDemo.divide(MyExceptionDemo.java:27)
at exception.MyExceptionDemo.main(MyExceptionDemo.java:32)
运行结果2:
msg=亲,除数不能为0
2
exception.MyException2: 亲,除数不能为0
1
222
at exception.MyExceptionDemo.divide(MyExceptionDemo.java:27)
at exception.MyExceptionDemo.main(MyExceptionDemo.java:32)
运行结果3:
msg=亲,除数不能为0
2
exception.MyException2: 亲,除数不能为0
at exception.MyExceptionDemo.divide(MyExceptionDemo.java:27)
at exception.MyExceptionDemo.main(MyExceptionDemo.java:32)
1
222
------最佳解决方案--------------------

是 IDE 的多线程输出造成的

Eclipse 和 Netbeans 都是用一个专门的线程用来输出 System.out,另一个专门的线程用来输出 System.err

当你的程序里同时有这两种输出的时候,就会表现为多线程式的随机输出,如果单看你用 System.out 输出的内容,还是按顺序的。



你的输出都是用了 System.out ,只有这一句:

e.printStackTrace();

是用了 System.err,下面是这个方法的源代码,在 Throwable.java 中:


    public void printStackTrace() {
        printStackTrace(System.err);
    }

------其他解决方案--------------------
你这个是一次结果,只不多控制台的异常位置变化而已.....一般采取方式是....不用管它....
------其他解决方案--------------------
不懂啊 刚学java没几天
------其他解决方案--------------------
位置不一样,内容是一样的,造成这位置不一样的原因,应该是异常产生的快慢造成的。
比较快时,就在打印1和222之前产生了,当然就在前面了。
------其他解决方案--------------------
楼上正解!其实,这个无所谓把
------其他解决方案--------------------
如果你用控制台来运行,就不会有这个问题。

如果你把

e.printStackTrace();

改成 

e.printStackTrace(System.out);

也不会有这个问题。