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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 严露华 中级黑马   /  2013-4-29 17:45  /  1687 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 严露华 于 2013-4-29 17:47 编辑

看以下代码
  1. class ExceptionA extends Exception {
  2.     public ExceptionA(String str) {
  3.         super(str);
  4.     }
  5. }

  6. class ExceptionB extends ExceptionA {

  7.     public ExceptionB(String str) {
  8.         super(str);
  9.     }
  10. }

  11. class ExceptionC extends ExceptionA {
  12.     public ExceptionC(String str) {
  13.         super(str);
  14.     }
  15. }
  16. public class NeverCaught {
  17.     static void f() throws ExceptionB{
  18.         throw new ExceptionB("exception b");
  19.     }

  20.     static void g() throws ExceptionC {
  21.         try {
  22.             f();
  23.         } catch (ExceptionB e) {
  24.             ExceptionC c = new ExceptionC("exception a");
  25.             throw c;
  26.         }
  27.     }

  28.     public static void main(String[] args) {
  29.             try {
  30.                 g();
  31.             } catch (ExceptionC e) {
  32.                 e.printStackTrace();
  33.             }
  34.     }

  35. }
复制代码
打印出来的结果是
        ExceptionC      
        at NeverCaught.g(NeverCaught.java:28)
        at NeverCaught.main(NeverCaught.java:35)
为什么只打印出了ExceptionC而没有打印出ExceptionB呢?这些语句又是该如何执行的呢?

4 个回复

倒序浏览
因为你调用f()方法的时候将出现的ExceptionB异常处理了, 处理的方式是抛出了一个 ExceptionC c = new ExceptionC("exception a"); 自然结果就会是你抛出的新异常   

static void f() throws ExceptionB{     //这里会抛出一个异常ExceptionB, 也就是调用这个方法会出现这个异常

        throw new ExceptionB("exception b");

    }

    static void g() throws ExceptionC {

        try {

            f();       //调用这个方法时出现了异常, 被下面的catch处理了

        } catch (ExceptionB e) {    //捕获了ExceptionB异常, 下面对其进行了处理

            ExceptionC c = new ExceptionC("exception a");    //创建了一个新的异常对象

            throw c;      //将这个新的异常抛出

        }

    }
回复 使用道具 举报
楼主你有必要搞这么复杂嘛。。
我都看花眼了。
第一步:g();
第二步:f(); 抛出异常b。
第三步:g() 里面catch处理。抛出一个新异常c。
第四步:回到main,catch处理。打印异常c。

回复 使用道具 举报
你把f()方法的异常给catch住了,但在catch块里打印的是ExceptionC的信息,所以没有打印ExceptionB的信息。
回复 使用道具 举报

如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马