IndexOutOfBounds异常Java String类charAt方法

时间:2014-12-17 10:37:22

标签: java string charat

Java String类的方法CharAt抛出StringIndexOutOfBoundsException。但Java API文档说它会抛出IndexOutOfBoundsException。我知道StringIndexOutOfBoundsExceptionIndexOutOfBoundsException的子类。但是抓住StringIndexOutOfBoundsException而不是IndexOutOfBoundsException是不正确的?

这是charAt方法的代码

public char charAt(int index) {
        if ((index < 0) || (index >= value.length)) {
            throw new StringIndexOutOfBoundsException(index);
        }
        return value[index];
    }

5 个答案:

答案 0 :(得分:0)

不,这不是不正确的。但是你可以保存几个键击并只使用IndexOutOfBoundsException,除非你有一个使用String索引的方法,例如数组索引或列表索引等。然后,您可以区分异常类型以区别对待案例。

答案 1 :(得分:0)

只有最接近的异常抛出,当我们总是throw/use Exception class时,需要有这么多内置的异常类。

你有ArrayIndexOutOfBoundsException数组,类似StringIndexOutOfBoundsException用于处理字符串等。

更多here

答案 2 :(得分:0)

在这种情况下我更喜欢IndexOutOfBoundsException

 public static void main(String[] args) {
    String s = "abc";
    String[] arr = new String[1];
    for (int i = 0; i < 2; i++) {
        try {
            s.charAt(5);
            System.out.println(arr[2]);
        } catch (IndexOutOfBoundsException e) { // catch both ArrayIndexOutOfBounds as well as StringIndexOutOfBounds and treat them similarly.
            System.out.println("caught");
            s = "aaaaaaaaaa";
            e.printStackTrace();

        }
    }

}

O/P :
0
java.lang.StringIndexOutOfBoundsException: String index out of range: 5
caught
caught
    at java.lang.String.charAt(Unknown Source)
    at StaticAssign.main(Sample.java:41)
java.lang.ArrayIndexOutOfBoundsException: 2
    at StaticAssign.main(Sample.java:42)

没错。这只是一个设计考虑因素。这同样适用于IOExceptionFileNotFoundException

答案 3 :(得分:0)

您不应该查看具体的实现。文档说它抛出IndexOutOfBoundsException,然后如果你想处理这个(这不是真的有必要),你最好抓住它。

可能有不同的Java实现不进行检查,只是让数组访问抛出ArrayIndexOutOfBoundsException,或者在下一个版本中Oracle可能决定这样做。

只需处理StringIndexOutOfBoundsException就可以将您与特定的实现相结合,而不是API文档中描述的一般合同。

我上面的例子纯粹是假设的,因为StringIndexOutOfBoundsException的文档坚定地确定String应该抛出它,但作为一般规则:遵循合同。

答案 4 :(得分:0)

这不是不正确的,因为这是方法实际抛出的内容,因为它是RuntimeException(即未经检查),所以它并不重要,因为你不要#39; t必须要抓住它。

现在,如果它是一个经过检查的例外:

public char someMethod (int index) throws SomeCheckedException {
    if (index < 0) {
        throw new SomeSubCheckedException (index); // subclass of SomeCheckedException 
    }
    return something;
}

这里,如果你在try块中调用someMethod并且只捕获SomeSubCheckedException,代码就不会通过编译,因为就编译器而言,{{1} }可能会抛出someMethod的{​​{1}}实例。