class MyException extends Exception { }
class Tire {
void doStuff() { } // #4
}
public class Retread extends Tire {
public static void main(String[] args) {
new Retread().doStuff();
}
// insert code here
System.out.println(7/0);
}
并给出以下四个代码片段:
void doStuff() {
void doStuff() throws MyException {
void doStuff() throws RuntimeException {
void doStuff() throws ArithmeticException {
当在第10行独立地添加片段1-4时,这是真的吗? (选择所有适用的选项。)
答案:C和D是正确的。 重写方法不能抛出比重写方法引发的更广泛的已检查异常。但是重写方法可能会抛出被重写方法抛出的RuntimeExceptions。基于上述情况,A,B,E和Fare不正确。 (目标2.4)
在这种情况下,我没有得到BoldItalic标记所说的内容。重写方法(#4)不会抛出任何异常,因此我们如何知道我们添加到重写方法(选项2)的那个(在这种情况下是MyException)是否比重写方法更广泛。 Arithmetic异常是如何运行的,没有错误。它如何不比最重要的方法中的不知道哪个例外更广泛。
答案 0 :(得分:5)
重写方法void doStuff() { }
,它会使用其中一个选项抛出异常。所以,让我们一个接一个地看看它们:
void doStuff() { .. }
这个没关系,它不像基本方法那样抛出异常。
void doStuff() throws MyException { .. }
这个不会编译。 MyException
是一个经过检查的例外,因为它会扩展Exception
,并且基本方法根本不会声明任何已检查的例外。
void doStuff() throws RuntimeException { ... }
这样可行,因为RuntimeException
是未经检查的例外。
void doStuff() throws ArithmeticException { ... }
这也可以,因为ArithmeticException
是RuntimeException
,所以未经检查。
答案 1 :(得分:1)
void doStuff(){}
不会抛出任何已检查的例外。
所以覆盖方法也应该不抛出任何已检查的异常,
虽然可以抛出运行时异常(不需要提及声明)。
答案 2 :(得分:0)
如果重写的方法没有抛出已检查的异常,则覆盖方法也不能抛出。抛出已检查的异常对编译时没有任何意义。你可以抛出Runtime Exception的任何子类,而不会说这个方法会抛出等等。
运行时异常通常是错误和开发错误,例如nullpointerexception和arithmeticexception。在将它们发送到方法之前,您需要检查这些指针/值。否则,程序崩溃。
Hovewer,除了try / catch之外,你与已检查的异常无关。它们可能有许多原因,例如连接错误,文件系统错误,操作系统权限等。