[英]Method overriding in Java throwing exceptions
我试图了解对象强制转换和方法覆盖。
我有一段代码:
public class ExceptionClass{
void m() throws SQLException{}
}
class A extends ExceptionClass{
void m() throws Exception{}
}
这给出了一个错误“异常异常与ExceptionClass.m()中的throws子句不兼容”。
如果我写为:
public class ExceptionClass{
void m() throws SQLException{}
}
class A extends ExceptionClass{
void m() throws RuntimeException{}
}
这不会给出任何错误,并且方法也会被正确覆盖。 经过一些分析我认为可能是,因为SQLException从Exception类扩展,因此我们不能在子类中用“Exception”替换“SQLException”(我们正在改变重写方法的签名)。
但后来我这样做了:
public class ExceptionClass{
void m() throws NullPointerException{}
}
class A extends ExceptionClass{
void m() throws RuntimeException{}
}
但这里没有错误..! 我认为它应该给出同样的错误,因为我上面提到的原因。
我不确定为什么它会以这种方式表现。 当我们覆盖方法时要遵循的规则是什么,这些方法在方法签名中抛出异常。
NullPointerException
和RuntimeException
都是未经检查的异常。
它们不需要在throws
子句中列出。
您只能减少或消除重写方法中抛出的异常。 语言不允许抛出更广泛的异常。
来自Java文档 :
“重写方法的throws子句可能没有指定此方法将导致抛出任何被抛出的方法不允许被覆盖的方法被抛出的任何已检查异常。”
是的,你是正确的,因为方法签名的变化发生了第一个问题。 使用NPE和RuntimeException进一步激活它是不正确的,因为不需要在签名上声明运行时异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.