类Example A继承了Exception,类Example B继承了Example A;
有如下代码:
try{
throw new ExampleB("b");
}catch(ExampleA e){
System.out.println("ExampleA");
 }catch(Exception e){
System.out.println("Exception");
  }
下面答案正确的是:A
A.ExampleA   B.Exception  C.b  D.无为什么选择A呢,小弟不是很懂,希望大家指点下,最好能说详细点,非常感谢

解决方案 »

  1.   

    因为new ExampleB("b")得到的对象is -a ExampleA
      

  2.   

    类Example A继承了Exception,类Example B继承了Example A也就是Exception的范围大于Example A的范围大于Example B.捕获异常的范围是从最小范围开始,到Example A这里就被捕获了下面不会执行.
      

  3.   

    因为ExampleB extends ExampleA,所以可以把ExampleB看成是一个ExampleA,而ExampleA却不说成是ExampleB
      

  4.   

    异常的处理机制是这样的,首先从第一个Catch开始处理,一旦找到匹配的异常类型,就执行对应的Catch中的代码,然后忽略后面的Catch。从上面的例子来看,虽然throw的是ExampleB的实例,但它同时也是ExampleA的实例因此就被第一个catch(ExampleA e)所捕获,然后跳过了后面的ExampleB
      

  5.   

    由于继承的关系
    所以
    B is a A ; B is a Exception再加上catch就像多重if和switch 是一条一条判断的
    所以当到第一行catch(ExampleA e)的时候就被拉进去了(被强奸了)
    所以就选A了
      

  6.   

    3楼和5楼的答案已经很详尽了,我深感赞同。
    在多重catch语句中,位于上面的异常类只能是下面异常的子类或同一级别的其他异常类,
    不能是下面异常的父类,如这样,下面将永远也捕获到异常。在java中不允许执行不到的代码存在,
    在编译的时候就会报错。
      

  7.   


    大家都说的差不多了,但我提个注意事项.如果这样写编译会出错的
                   try{
    throw new ExceptionB();
    } catch(Exception e){
    System.out.println("exception");
    }
    catch(ExceptionA e)
    {
    System.out.println("exceptionA");
    }
    因为后面那个catch永远不回执行```
      

  8.   

    这样因为后面ExceptionA 的范围小于 Exception ,按照规则捕获异常的范围是从最小范围开始,这样违反了规则,所以就报错了~~
      

  9.   

    我觉得可以这样理解,异常处理机制就象 一层层的网,  撒网的时候是先撒小的 再撒大的, 这就是为什么把EXCEPTION A 写在前面  把EXCEPTION 写在后面的原因, 因为EXCEPTION B 是 A的子类,所以 catch(exception a)时就可以捕获到, 异常没有漏网,下面的肯定捕获不到啦.解释不专业,意思大家也能明白的哈
      

  10.   

    如果捕获的异常在前面已经拦截到了,则后面的异常就不会再捕获了,相反,如果把Exception放在前面,则ExampleA就捕获不到了,因为Exception包括了这里一切的异常
      

  11.   

    DING
      

  12.   

    DING