import java.io.*;
public class EclipseBugTest {
public static void main(String[] args) {
try{
throw new IOException("excepton info");
}
catch(IOException e){
e.printStackTrace();
}
System.out.println("normal info");
}
}
上面的代码,各位觉得会如何输出呢,正确的输出是这样的:
java.io.IOException: excepton info
at EclipseBugTest.main(EclipseBugTest.java:5)
normal info
可是在Eclipse(我用的是3.2版本)的输出结果却是这样的:
normal info
java.io.IOException: excepton info
at EclipseBugTest.main(EclipseBugTest.java:5)
也就是Eclipse会先输出正常的流(姑且先这样叫吧),然后在输出错误流(即异常输出流),无论在实际运行中的输出先后.因此像下面的例子:
import java.io.*;
public class EclipseBugTest {
public static void main(String[] args) {
try{
throw new IOException("excepton info");
}
catch(IOException e){
e.printStackTrace();
}
System.out.println("normal info");
try{
throw new IOException("excepton info2");
}
catch(IOException e){
e.printStackTrace();
}
System.out.println("normal info2");
}
}
在Eclipse的输出是这样的:
normal info
normal info2
java.io.IOException: excepton info
at EclipseBugTest.main(EclipseBugTest.java:5)
java.io.IOException: excepton info2
at EclipseBugTest.main(EclipseBugTest.java:12)
为什么会出现这样的错误呢?
我以前写过在线JAVA(其实就是在WEB上编译运行你的java文件,调用的服务器的编译器和虚拟机,客户机上不用装jdk)也遇到相似的问题,这里涉
及到进程输出流的问题.我们知道Eclipse编译和运行JAVA其实也就是调用系统的jdk,运行JAVA 也就是启用一个虚拟机进程去运行的JAVA文件,
再从这个进程中读取输出流信息,再将信息显示出来.问题就出现在进程的输出流有两种,姑且先叫它错误流和正常流吧,分别是用Process的
getErrorStream(),和getInputStream()获得的.错误流输出的进程运行的的异常信息,如用e.printStackTrace()就是输入到这个流的;正常流输
出的是如System.out.println("...")等的输出信息.Eclipse的BUG问题就在于它获取虚拟机进程的输出信息是先丛正常流中获取,读完正常流的
信息再去读错误流的信息,因此无论你的程序中的异常信息和正常的输出顺序如何,它都是先输出正常的信息,再输出异常信息.
那这个问题要如何解决呢,以前在写在线JAVA时是这样实现的,启用两个线程,把运行JAVA虚拟机进程的错误流,和正常流先读出然后写到一个管
道流中,在从这个管道流中读取输出信息.这样在管道流中的正常输出信息和异常输出信息的顺序就可以和实际运行出现输出的一致了(当然不能
100%正确,只能99.999%,呵呵,具体原因和CPU线程调度有关吧)
上面只是我的想法,各位有何高见可以交流交流,我的Email:hhl417@163.com ,QQ:410450607