子类重写父类方法时检查异常范围不能变宽,只能缩小或去掉;运行时异常可自由添加;若父类无throws声明,子类不得新增检查异常,应捕获后转为运行时异常。子类重写父类方法时抛出异常,核心是遵守“异常范围不能变宽”这条编译规则。不是想抛什么就抛什么,而是必须和父类声明的检查异常保持兼容。
父类方法如果声明 throws IOException,子类重写时只能:
throws IOException
throws FileNotFoundException
throws,也就是不抛任何检查异常不能写 throws Exception 或 throws SQLException(除非它是 IOException 的子类),否则编译器会报错:“overridden method does not throw …”
RuntimeException 及其子类(如 IllegalArgumentException、NullPointerException)不受限制:
throws IllegalArgumentException
如果父类方法签名是 void doWork()(无 throws),子类重写时:
立即学习“Java免费学习笔记(深入)”;
throws IOException —— 编译直接失败try-catch 拦住throw new RuntimeException(e)
多数情况下,不建议让子类暴露新的检查异常。更稳妥的做法是:
try-catch 捕获底层检查异常throw new DataAccessException("save failed", e)
catch 块