java – 为什么我可以在没有“throws”关键字的情况下声明一个函数?

请考虑以下代码:

public interface I1 {
 public void bar1() throws IOException; 
} 

public interface I2 extends I1 { 
 public void bar2() throws Exception; 
} 

public interface I3 { 
 public void bar3() throws Exception; 
} 

public abstract class A implements I2 { 
 public void bar2() throws Exception{}; 
 public void bar3() throws Exception{}; 
 protected abstract void bar4(); 
 protected void bar5() {}; 
}

现在,我创建了一个类,B如下:

public class B extends A implements I3 {

    @Override
    protected void bar4() {}

    public void bar1()  {}

}

为什么编译器让我这样做?我的意思是,不应该是:
public void bar1()抛出IOException;

最佳答案 覆盖时,不能抛出更大或更新的异常.不允许抛出超类方法的异常.

重写方法不得抛出新的或更广泛的已检查异常,而不是重写方法声明的异常.例如,声明FileNotFoundException的方法不能被声明SQLException,Exception或任何其他非运行时异常的方法覆盖,除非它是FileNotFoundException的子类.

点赞