问题描述
JAVA中重写的方法能不能比被重写的方法抛出更多的种类的异常?
解决方案
重写的主要优点是能够定义子类特有的特征: 如: public class Father{ public void speak(){ System.out.println("Father"); } } public class Son extends Father{ public void speak(){ System.out.println("son"); } } 这也叫做多态性,重写方法只能存在于具有继承关系的类中,重写方法只能重写父类非私有的方法,当上例中Father类的speak()方法为private时,Son类不能重写speak()方法,此时在Son类中定义的speak()方法相当于一个新的方法,与Father中的speak()方法没有任何关系. 当Father类的speak()方法声明为final时,无论该方法的修饰符是public,protected还是默认,Son类根本不能重写speak()方法,试图编译代码时,编译器会报错.例: public class Father{ final void speak(){ System.out.println("Father"); } } public class Son extends Father{ public void speak(){ System.out.println("son"); } }//编译器错误信息:Son 中的 speak() 无法覆盖 Father 中的 speak();被覆盖的方法为 final 重写方法的规则: 1.参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载; 2.返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载; 3.访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private); 4.重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常.例如: 父类的一个方法申明了一个检查异常IOException,在重写这个方法时就不能抛出Exception,只能抛出IOException的子类异常,可以抛出非检查异常(unchecked exception,如运行时异常). 重载方法的规则: 1.必须具有不同的参数列表; 2.可以有不同的返回类型,只要参数列表不同就可以了; 3.可以有不同的访问修饰符; 4.可以抛出不同的异常; 示例: public class Father{ public void speak(){ System.out.println("Father"); } public void speak(String info){ System.out.println("Father speak:" + info); } }
解决方案二:
在接口中定义的方法例如:public void startTask(String jobId, String triggerId) throws AppException;在实现这个方法的时候 对于 AppException这个异常是默认抛出的 当然你也可以手动 throw new XXXException 等等