黑马程序员技术交流社区

标题: 在一次讨论关于异常的问题? [打印本页]

作者: 严露华    时间: 2013-4-29 17:45
标题: 在一次讨论关于异常的问题?
本帖最后由 严露华 于 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呢?这些语句又是该如何执行的呢?


作者: breeze    时间: 2013-4-29 18:12
因为你调用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;      //将这个新的异常抛出

        }

    }

作者: 殇_心。    时间: 2013-4-29 18:14
楼主你有必要搞这么复杂嘛。。
我都看花眼了。
第一步:g();
第二步:f(); 抛出异常b。
第三步:g() 里面catch处理。抛出一个新异常c。
第四步:回到main,catch处理。打印异常c。


作者: xiewen    时间: 2013-4-30 17:14
你把f()方法的异常给catch住了,但在catch块里打印的是ExceptionC的信息,所以没有打印ExceptionB的信息。
作者: 曹睿翔    时间: 2013-5-2 06:32

如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢




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