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();
   }
}

解决方案 »

  1.   

    因为子类重写了父类中的方法,子类中process方法就没有抛出异常者,处理谁啊?
      

  2.   


    你此处只不过是手动抛出了一个异常throw new IndexOutOfBoundsException();子类怎么可能继承你这个手动抛出的异常呢?在子类中又重写了process()方法,所以子类process()就不会抛出异常。
      

  3.   

    因为抛出的IndexOutOfBoundsException是unchecked异常(java.lang.RuntimeException的子类)
    unchecked异常是不需要强制处理的。对于Override,异常声明不属于方法签名(method signature),所以B.process()不需要声明抛出异常。
      

  4.   

    如果父类某个方法声明了会抛出异常,则子类重写父类的这些方法时,只能声明父类已经声明过的异常,或者是比父类更“精确”的异常,也就是父类的方法中声明抛出异常的子类,或者子类不声明抛出异常比如说有异常类:
    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 方法会处理所有的异常。