2013-07-01 65 views
1
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); 
} 

并给予下述的四个码片段:爪哇:异常声明而方法overidding

  1. void doStuff() {
  2. void doStuff() throws MyException {
  3. void doStuff() throws RuntimeException {
  4. void doStuff() throws ArithmeticException {

当片段1 - 在第10行独立添加4个,这是真的吗? (选择所有适用)。

  • A.无将编译
  • B.他们都将编译
  • C.一些,但不是全部,将编译
  • D.所有那些编译在运行时会抛出异常
  • 是编译在运行时会抛出异常的
  • E.无
  • F.只有一些是编译会抛出运行时异常的

答案:C和D是正确的。 重写方法不能抛出比被覆盖的方法抛出的检查异常更广泛的检查异常。但是,重写方法可以抛出重写方法不抛出RuntimeException。 A,B,E和票价根据上述不正确。 (目标2.4)

我没有得到什么BoldItalic标记在这种情况下说。重写方法(#4)不会抛出任何异常,所以我们如何知道我们添加到重写方法(选项2)的方法(本例中为MyException)是否比重写方法更广泛。算术异常如何运行,没有错误。它如何不超过压倒一切的方法中的不知道哪个例外。

回答

0

如果重写的方法不会抛出检查异常,重写方法也不会抛出。抛出已检查的异常对编译时没有任何意义。你可以抛出任何运行时异常的子类,而不会说这个方法抛出等等。

运行时异常通常是错误和开发错误,如nullpointerexception和arithmeticexception。在将它们发送给方法之前,您需要检查这些指针/值。否则,程序崩溃。

Hovewer,除了try/catch之外,你与检查的异常无关。他们可能有很多原因,如连接错误,文件系统错误,操作系统权限等。

5

您覆盖方法void doStuff() { },其中一个选项不会引发异常。所以让我们一个一个来看看它们:

void doStuff() { .. } 

这个是好的,它不会抛出像基本方法的异常。

void doStuff() throws MyException { .. } 

这一个不会编译。 MyException是一个检查异常,因为它扩展了Exception,并且基本方法根本没有声明任何检查的异常。

void doStuff() throws RuntimeException { ... } 

这将工作,因为RuntimeException是一个未经检查的异常。

void doStuff() throws ArithmeticException { ... } 

这也可以工作,因为ArithmeticExceptionRuntimeException,所以选中。

1

空隙doStuff(){}

不抛出任何检查的异常。

这样压倒一切的方法也应该不能扔任何checked异常,

虽然可以抛出运行时异常(不必是声明被提及)。