8

我有一个疑问Exception with Inheritance

为什么

public class ArrayIndexOutOfBoundsException extends IndexOutOfBoundsException

接着

public class IndexOutOfBoundsException extends RuntimeException

接着

public class RuntimeException extends Exception

为什么不

public class ArrayIndexOutOfBoundsException extends Exception

为什么要维护这种层次结构。任何指导都会有所帮助?

4

4 回答 4

9

那是因为ArrayIndexOutOfBoundsException也是IndexOutOfBoundsException, 和RuntimeException

在您的建议中,ArrayIndexOutOfBoundsException只会是Exception.

所以如果你只想抓RuntimeException例如,ArrayIndexOutOfBoundsException就不会被抓。

于 2013-10-16T08:52:25.483 回答
7

这样做的目的是保持一个有意义的层次结构,并且还用于对相关的异常进行分组。

此外,如果您知道 anIndexOutOfBoundsException是什么,并且有人给了您另一个扩展这个例外的例外,您可以立即从这个事实中收集信息。在这种情况下,一些涉及的对象将索引保持在一定范围内。

如果每个异常都扩展ExceptionRuntimeException(是否应该检查或不检查它的出现),并且它的名称有些晦涩,那么您将不知道它可能代表什么。

考虑以下代码。

try {
    for (int i = 0; i < limit; ++i) {
        myCharArray[i] = myString.charAt(i);
    }
}
catch (StringIndexOutOfBoundsException ex) {
    // Do you need to treat string indexes differently?
}
catch (ArrayIndexOutOfBoundsException ex) {
    // Perhaps you need to do something else when the problem is the array.
}
catch (IndexOutOfBoundsException ex) {
    // Or maybe they can both be treated equally.
    // Note: you'd have to remove the previous two `catch`.
}
于 2013-10-16T09:10:17.500 回答
1

因为ArrayIndexOutOfBoundsException是 的子类型IndexOutOfBoundsException

于 2013-10-16T08:52:13.863 回答
1

这就是继承发挥作用的地方,它有助于保持继承层次的干净和集中,主要目标是可扩展性。不仅在数组中甚至在字符串等中都有错误的索引。HTH

于 2013-10-16T09:00:03.320 回答