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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马_许芸 中级黑马   /  2012-9-8 11:21  /  2641 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如下的代码运行的结果为什么是:Exception in thread "main" java.lang.Error
                                                at X.badMethod(X.java:22)
                                                at X.main(X.java:9)
                                                B
我觉得应该是:A
                      B                         为什么会结果是这样你?请高手帮忙解答下
public class X {
public static void main(String[] args) {
  try{
   badMethod();
   System.out.println("A");
  }catch(Exception ex)
  {
   System.out.println("C");
  }
  finally{
   System.out.println("B");
  }
  System.out.println("D");
}
public static void badMethod() {
  throw new Error();
}
}

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 细节问题要多多注意

查看全部评分

9 个回复

倒序浏览
public class X {
public static void main(String[] args) {
   try{
    badMethod();//抛出异常后,后面的代码将得不到执行的机会了。
    System.out.println("A");//这句话不可能被执行到。
   }catch(Exception ex)
   {
    System.out.println("C");
   }
   finally{
    System.out.println("B");//finally是必须执行到的语句块,所以这里会被打印。
   }
   System.out.println("D");
}
public static void badMethod() {
   throw new Error();
}
}
回复 使用道具 举报
public class X {
public static void main(String[] args) {
  try{
   badMethod();//此方法抛出异常后就会跳出程序,而只有finally中的代码会执行到   
System.out.println("A");
  }catch(Exception ex)
  {
   System.out.println("C");
  }
  finally{
   System.out.println("B");
  }
  System.out.println("D");
}
public static void badMethod() {
  throw new Error();
}
}
回复 使用道具 举报
new Error(); 不要写这个。。否则catch块捕捉不到这个异常你传入的事 Exception 类型的参数 ,但是Error和Exception 属于没有继承关系,只是有一个共同的父类Throwalbe
回复 使用道具 举报
楼主,函数执行的时候,先找到主函数入口
执行try语句,执行第一句的时候,调用badMethod方法,程序就跳转出去,所以打印A的语句就没
有执行到,跳转到函数badMethod,则抛出一个错误而try{}catch(){}是处理异常的语句,所以
抛出了错误,catch就捕捉不到这个错误,所以catch语句里面的内容就执行不到,而finally语句是
一定能执行到的语句,故能够执行到打印B的语句

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
public class MyTest {

        public static void main(String[] args) {

                try{
                        badMethod();
                        System.out.println("A");
                      }
                catch(Error ex)//这里面可以catch他的父类(throwable)和你throw出来的(Error)
                   {
                            System.out.println("C");
                   }
                  finally
                {
                            System.out.println("B");
                   }
                   System.out.println("D");
         }

        public static void badMethod() {

                   throw new Error();
        }
}
/*
照上面修改过后输出结果就是:
C
B
D
至于你的错误的原因就是:
你抛出个Errro但是jvm捕获的却是Exception,只可以是自己自身或者父类。

就跟我们继承父类的方法一样如果父类的方法没有异常,我们必须try catch处理。
如果父类的方法抛出异常了我们必须抛小于等于其异常或者不抛(自己处理掉)。
catch和这个是相反的,在你这个例子就体现出来了。
*/

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
因为badMethod()方法写的是throw new Error();啊.程序运行到badMethod()方法是,就抛出一个Error,只要抛出一个Error,程序就不会再执行try块中后面的代码,而是直接跳到catch块和finally块中.但是你的catch块是catch的Exception,而不是Error,所以你的badMethod()执行后,不会跳到catch块中,而是直接跳到finally块中,finally块的代码执行完后,程序就直接返回(如果你的catch块不是catch的Exception,而是catch的Error,那么会先执行catch块的代码,接着执行finally块的代码,最后程序不会结束,而是执行finally块后面的代码.),希望对你有所帮助.
回复 使用道具 举报
1.try{...}catch(Exception ex){...} finally{...}语句中,finally语句一定会被执行,所以会执行 System.out.println("B");  打印出 B

2.Throwable下有两个子类  Error 和 Exception,badMethod();方法执行完后,向外抛出了一个Error,而你的try{}catch(Exception ex){}语句是要catch到一个Exception才会执行catch代码块中的语句,所以 System.out.println("C"); 无法执行,

3.当JVM检测到Error后,程序就会停止执行,并打印出错误,所以 System.out.println("A");  以及 System.out.println("D"); 无法执行

因此,程序最终的执行结果如下:
Exception in thread "main" java.lang.Error
B
        at X.badMethod(X.java:16)
        at X.main(X.java:4)

回复 使用道具 举报
lz 很简单啦
badMethod();这里抛出异常就不往下执行啦,finally里面又是必须要执行的部分咯,所以就会出现这个样子
回复 使用道具 举报
问题已解决,谢谢大家。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马