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 时,哪个是正确的?(选择所有适用项。
- 一个。没有一个会编译
- 二.他们都会编译
- 三.一些(但不是全部(将编译
- D.所有编译的都将在运行时引发异常
- E.编译的那些都不会在运行时引发异常
- F.只有一些编译的会在运行时引发异常
答:C 和 D 是正确的。重写方法不能引发比重写方法引发的异常更广泛的已检查异常。但是,重写方法可以引发未由重写方法引发的运行时异常。基于上述情况,A、B、E 和票价不正确。(目标2.4(
在这种情况下,我不明白粗斜体标记在说什么。重写方法不会引发任何异常,因此我们如何知道我们添加到重写方法(选项2(中的那个(在本例中为MyException(是否比重写方法更广泛。算术异常如何运行而没有错误。它怎么不比覆盖方法中的不知道哪个异常更广泛。
您可以覆盖方法void doStuff() { }
,该方法不会对其中一个选项引发异常。因此,让我们一一看一下:
void doStuff() { .. }
这个没关系,它不像基方法那样抛出异常。
void doStuff() throws MyException { .. }
这个不会编译。 MyException
是已检查的异常,因为它扩展了Exception
,并且基方法根本不声明任何已检查的异常。
void doStuff() throws RuntimeException { ... }
这将起作用,因为RuntimeException
是未经检查的异常。
void doStuff() throws ArithmeticException { ... }
这也行得通,因为ArithmeticException
是 RuntimeException
,所以不受选中。
void doStuff(( { }
没有抛出任何已检查的异常。
所以重写方法也不应该抛出任何检查过的异常,
虽然它可以抛出运行时异常(不需要提及声明(。
如果重写的方法不引发检查异常,则重写方法也不能引发。抛出选中的异常对编译时没有任何意义。你可以抛出运行时异常的任何子类,而不说这种方法会抛出等等。
运行时异常通常是错误和开发错误,例如空指针异常和算术异常。在将这些指针/值发送到方法之前,您需要检查它们。否则,程序崩溃。
Hovewer,除了尝试/捕获之外,您与检查的异常无关。它们可能有多种原因,例如连接错误、文件系统错误、操作系统权限等。