是关于重写的问题。代码如下:
package com.neil.unit.override;public class UnitTest {

public static void main(String[] args) {

}
}class Base{
public void f(){
System.out.println("Base public void f()");
}
}class SubClass extends Base{
@Override
public void f()throws ExceptionInInitializerError{
System.out.println("SubClass public void f() throws Exception");
}
}
如果这句话
@Override
public void f()throws ExceptionInInitializerError{
System.out.println("SubClass public void f() throws Exception");
}
我换成了
@Override
public void f()throws Exception{
System.out.println("SubClass public void f() throws Exception");
}
就会报错,这是为什么?
新人分有限,就这么点了。

解决方案 »

  1.   

    重写的方法如果父类没有声明抛出异常子类不能声明抛出,但可以声明抛出错误,至于何解还需要大虾解释。楼主可以试一下将代码改成如下,一样不会出错。@Override
    public void f()throws Error{
           System.out.println("SubClass public void f() throws Exception");
    }
      

  2.   

    先要明白:
    1、ExceptionInInitializerError属于Error类型,属于不可预见的错误。
    2、Exception属于异常类型,属于可预见异常。
    3、子类覆盖父类方法的时候,不能抛出比父类方法更多的异常。
    那么:
    1、你改过之后想要抛出Exception,但是父类方法f,没有抛出异常,所以也不允许子类抛出异常,所以报错;
    2、为什么原来的程序可以抛出ExceptionInInitializerError?因为Error不属于异常,属于不可预见的错误,发生错误时,不论方法是否声明,都必须抛出,因此不受异常类型的限制。
      

  3.   

    Throwable有两个子类Exception和Error,这两个是兄弟关系呦