日期:2014-05-20  浏览次数:20738 次

有趣的问题,求教
是关于重写的问题。代码如下:
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");
}
就会报错,这是为什么?
新人分有限,就这么点了。


------解决方案--------------------
重写的方法如果父类没有声明抛出异常子类不能声明抛出,但可以声明抛出错误,至于何解还需要大虾解释。楼主可以试一下将代码改成如下,一样不会出错。
Java code

@Override
public void f()throws Error{
       System.out.println("SubClass public void f() throws Exception");
}

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