我正在尝试理解对象强制转换和方法覆盖。
我有一段代码:
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{}
}
但这里没有错误..!由于我上面提到的原因,我认为应该给出同样的错误。
我不确定为什么它会以这种方式表现。 当我们覆盖在方法签名中抛出异常的方法时,要遵循的规则是什么。
答案 0 :(得分:4)
NullPointerException
和RuntimeException
都是未经检查的例外。
它们不需要列在throws
子句中。
答案 1 :(得分:3)
您只能减少或消除重写方法中抛出的异常。语言不允许抛出更广泛的例外。
“重写方法的throws子句可能没有指定这个 方法将导致抛出任何已检查的异常 通过其throws子句,不允许重写方法抛出。“
答案 2 :(得分:1)
是的,由于方法签名的更改,您发现第一个问题是正确的。使用NPE和RuntimeException进一步激活它是不正确的,因为不需要在签名上声明运行时异常。