同样的代码,运行一次一种结果,怎么回事?
本帖最后由 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);
也不会有这个问题。