//: Human.java
// Catching Exception Hierarchies
class Annoyance extends Exception {}
class Sneeze extends Annoyance {}
public class Human {
public static void main(String[] args) {
try {
throw new Sneeze();
}
catch(Sneeze s) {
System.out.println("Caught Sneeze");
}
  
catch(Annoyance a) {
System.out.println("Caught Annoyance");
} catch(Exception e){
System.out.println("Caught Exception");
}
}
}
为什么会报错?class Annoyance extends Exception {}
class Sneeze extends Annoyance {}
public class Human {
public static void main(String[] args) {
try {
throw new Annoyance();
}
catch(Sneeze s) {
System.out.println("Caught Sneeze");
}
  
catch(Annoyance a) {
System.out.println("Caught Annoyance");
} catch(Exception e){
System.out.println("Caught Exception");
}
}
}
这样为什么有不报错呢?
Exception是Annoyance的父类不报错
而上例Annoyance是Sneeze的父类却会报错?

解决方案 »

  1.   

    我怎么没看出来为抛异常?
    第一个输出aught Sneeze,第二个例子输出Caught Annoyance
    没问题啊。
      

  2.   

    正确的啊。你catch到异常只是打印了一下而已。
    第一个catch到Sneeze异常,所以打印Sneeze
    第二个catch到Annoyance异常,所以打印Annoyance。
    正确的程序
      

  3.   

    正确的捕获异常的顺序是:
    先捕获最精确地那个异常,然后范围慢慢扩大
    比如
        java.lang.Exception
            java.io.IOException
                java.nio.charset.CharacterCodingException进行IO操作的时候,有可能会出现编码错误,应该先捕获CharacterCodingException,然后 IOException, 最后是Exception.catch(CharacterCodingException){}
    catch(IOException){}
    catch(Exception)如果最上层的异常被捕获了,下面的就不会再运行了