黑马程序员技术交流社区

标题: 发现的小问题 求解决下 0 0 [打印本页]

作者: 李志群    时间: 2012-10-23 23:59
标题: 发现的小问题 求解决下 0 0
本帖最后由 李志群 于 2012-10-24 14:51 编辑

今天无意中敲异常的小例子  我用的Eclipse 敲的   控制台上输出的异常信息 怎么都没有顺序的呢 0 0 有图有例子。
看看 顺序位置 ,多运行几次 一定有我这种结果 不信大家试一试~!~!  懂原理的给讲讲

class Demo{
int div(int a,int b)throws Exception{
  return a/b;
}
}
public class ExceptionDemo {
/**
  * @param args
  */
public static void main(String[] args)//throws Exception
{
  // TODO Auto-generated method stub
//   int[] arr = new int[2];
//   System.out.println(arr[2]);//角标越界。
//  int[] arr = new int [1024*1024*700];//内存溢出
//  arr = null;
//  System.out.println(arr[2]);
  Demo d = new Demo();
  try{
   int x = d.div(4,0);//java.lang.ArithmeticException
   System.out.println("x="+x);
   //Jvm 默认异常处理方式就是将收到的异常 名字,信息,
  //位置,都打印在控制台上。
  //结束程序。
  }catch(Exception e){
   System.out.println("message: "+e.getMessage());//信息
   System.out.println("信息:"+e.toString());//异常名字+信息
   System.out.println("啊,异常了");//
   e.printStackTrace();//打印异常的信息和名字+位置
  }
  System.out.println("over");
}
}

1.jpg (24.2 KB, 下载次数: 25)

看每个异常信息位置

看每个异常信息位置

2.jpg (23.81 KB, 下载次数: 21)

看每个异常信息位置

看每个异常信息位置

3.jpg (27.57 KB, 下载次数: 22)

看每个异常信息位置

看每个异常信息位置

4.jpg (24.9 KB, 下载次数: 22)

看每个异常信息位置

看每个异常信息位置

作者: 张学东    时间: 2012-10-24 00:46
刚刚去百度了下,,,,我觉得还是同意我的观点。。。e.pritStackTrace() 启动的时候 会创建一个线程,这样程序就属于多线程了 当然就像在群里说的一样,cup,,,,呵呵呵 cup随机执行。。。。。
作者: 李连闯    时间: 2012-10-24 02:32
本帖最后由 lilianchuang 于 2012-10-24 12:05 编辑

首先需要了解下System.out/System.err这里面的out和err都是PrintStream类型的实例,
System.out.println呢明显用的是out这个实例对象,
进入printStackTrace()
public void printStackTrace() {
        printStackTrace(System.err);
    }
可以看到printStackTrace方法使用的PrintStream实例其实就是System.err;
所以打印结果的变化的主要原因就在于out和err的使用上了,
这里涉及到操作系统为System.out和System.err分配的资源空间不同,可以理解为他们存放的数据不是在一个地方,
这样的话因为操作系统的调度把数据刷出来的时间不同,就可能使数据的打印顺序得到保障了,
例如
System.out.println(mess1);
System.out.println(mess2);
System.out.println(mess3);
System.err.println(mess4);
正常的顺序是mess1,mess2,mess3,mess4的打印,但是也可能发生out和err都接收数据后,操作系统第一个调度把err的mess4最先打印输出然后才是out的mess1,mess2,mess3
也可能是out输出mess1后,err的mess4被调度输出了,然后再是out的mess2,mess3 等等的可能...希望能有用。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2