父类方法未抛异常,重写方法不可抛异常。
class X{public void f(){}}class Y extends X{public void f() throws RuntimeException{}}这个为什么编译是正确的?
class Y extends X{public void f() throws Exception{}}这个编译错误的。按照第一句话可以理解。求指点,谢谢

解决方案 »

  1.   

    个人认为RuntimeException异常不是class Y extends X{public void f()的异常,
    Exception{}就会真的抛出异常
      

  2.   

    1.public class RuntimeException extends ExceptionRuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。 
    可能在执行方法期间抛出但未被捕获的 RuntimeException 的任何子类都无需在 throws 子句中进行声明。
    2.public class Exception extends ThrowableException 类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件。
    以上是JDK1.5帮助文档里的说明,个人理解应该是RuntimeExceptio是不需要抛出的,换句话说就是所有的类默认都抛出这个异常,而Exception比RuntimeExceptio范围大,子类是不能抛出比父类范围大的异常的,这个是java的语法
      

  3.   

    class Y extends X{public void f() throws RuntimeException{}}这个为什么编译是正确的?RuntimeException是运行时异常,不强制要求捕捉,所以有没有都没关系
      

  4.   

    正确的说法应该是:子类方法中跑出的异常范围应该更加小,或者根本不抛出任何异常。
    而在异常的分类中,RuntimeException属于未检查异常,是有方法的代码出错而抛出的。而其他的异常是由于外部条件不正确而抛出的,属于已检查异常。
    在方法的声明中,根本不应该抛出未检查异常,对于你这个
    class Y extends X{public void f() throws RuntimeException{}}
    完全可以写成是class Y extends X{public void f()},这样没有任何影响。建议楼主,看原理性的问题还是看:thinking in java 和java core。讲的深入仔细。
      

  5.   

    RuntimeException并非此异常
    Exception是所有异常的父类,当然此处报异常