A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Walking Walking 中级黑马   /  2013-3-10 17:13  /  1002 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 徐盼盼 于 2013-3-10 17:18 编辑

做异常的练习的时候做了以下的测试代码:
class ExceptionTest {
        
        public static void testException() throws Exception{ //throws 声明方法会抛出异常
               
                String s="";
                try{
                        System.out.println(s.toString()); //这里发生异常
                        throw new Exception(); //在try中抛出异常 ,说明在try中可以抛出异常
                        
                }catch(Exception e){ //catch是捕获抛出的异常
                        
                        System.out.println("抛出捕获到的异常");
                        throw e;
                        
                }finally{
                        System.out.println("in finally"); //finally不管异常是否发生总会被执行
                }
        }

        /**
         * @param args
         */
        public static void main(String[] args) {
               
                try {
                        ExceptionTest.testException();
                }catch(Exception e){
                        e.printStackTrace();
                }
        }

}

期望的输出顺序应该是:
抛出捕获到的异常
in finally
java.lang.Exception
        at ExceptionTest.testException(ExceptionTest.java:15)
        at ExceptionTest.main(ExceptionTest.java:33)
但是实际上顺序有时候的结果是这样的:
java.lang.Exception
抛出捕获到的异常
in finally
        at ExceptionTest.testException(ExceptionTest.java:15)
        at ExceptionTest.main(ExceptionTest.java:33)

或者
java.lang.Exception
at ExceptionTest.testException(ExceptionTest.java:15)
at ExceptionTest.main(ExceptionTest.java:33)
抛出捕获到的异常
in finally
这个就不理解了,难道是e.printStackTrace()是异步的吗?那如何将异步改为同步呢?

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1 赞一个!

查看全部评分

2 个回复

倒序浏览
      首先你这个程序里面不存在同步异步的问题,同步异步是多线程的时候考虑的,你这个程序是单线程执行的。
public static void main(String[] args) {
               
                try {
                        ExceptionTest.testException();
                }catch(Exception e){
                        e.printStackTrace(System.out);
                }
        }
你的程序的主函数改成我这样就没问题了!就是多了一个System.out参数,这是在指定流对象。
    根据你对程序输出的猜想可以看出来你能分析出程序执行的过程,之所以出现那种输出是因为你没有指定e.printStackTrace();用哪个流对象来输出,默认情况会重新创建一个流对象,而不是使用System.out。
    其实不管你是否指定流对象参数,程序执行路径还是你设想的那样的,只是两个输出流在竞争时,打印出的东西就没有顺序了。
回复 使用道具 举报
同意楼上的..
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马