public class ThrowTest {
static class A{
void process() throws IndexOutOfBoundsException{
throw new IndexOutOfBoundsException();
}
}
static class B extends A{
void process(){
System.out.println("B");
}
}
public static void main(String[] args) {
new A().process();
}
}
static class A{
void process() throws IndexOutOfBoundsException{
throw new IndexOutOfBoundsException();
}
}
static class B extends A{
void process(){
System.out.println("B");
}
}
public static void main(String[] args) {
new A().process();
}
}
你此处只不过是手动抛出了一个异常throw new IndexOutOfBoundsException();子类怎么可能继承你这个手动抛出的异常呢?在子类中又重写了process()方法,所以子类process()就不会抛出异常。
unchecked异常是不需要强制处理的。对于Override,异常声明不属于方法签名(method signature),所以B.process()不需要声明抛出异常。
ExceptionA extends Exception
ExceptionB extends ExceptionA某个父类 FatherClass 有方法:
public void f() throws ExceptionA那么子类 SunClass 在重写 f() 方法时,对可以声明抛出的异常有:
1、throws ExceptionA
2、throws ExceptionA、ExceptionB
3、throws ExceptionB
4、不声明抛出异常java 这样设计是有原因的。因为在 java 中规定了,除非继承自 RuntimeException 或它的子孙类的异常,程序中所有的异常要么把它捕捉自己处理,要么在方法定义时声明本方法会抛出某个异常。java 的编译器提供了对异常处理代码的检查。现在假设前面的例子中,子类重写了父类的方法 f(),并且子类声明会抛出 IOException,那么看下面的代码:public class MyClass{
public void myMethod(FatherClass obj){
try{
obj.f();
}catch(ExceptionA ex){
// 处理异常的代码
}
}
}但是根据多态的原理,myMethod 方法传入的 obj 很可能是FatcherClass 的子类 SunClass 的一个对象,也就是说 myMethod 的调用者是这样调用myMethod 方法的:FatherClass obj = new SunClass();
new MyClass().myMethod(obj);而在 SunClass 类中,f() 方法还声明了会抛出 IOException。
这样一来,编译器就无法保证 myMethod 方法会处理所有的异常。