2

Java String クラスのメソッド CharAt が StringIndexOutOfBoundsException をスローします。しかし、Java API ドキュメントによると、IndexOutOfBoundsException. StringIndexOutOfBoundsExceptionのサブクラスであることはわかっていIndexOutOfBoundsExceptionます。StringIndexOutOfBoundsExceptionしかし、代わりにキャッチするのは間違っていIndexOutOfBoundsExceptionますか?

charAt メソッドのコードは次のとおりです。

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

5 に答える 5

1

これはメソッドが実際にスローするものであるため、間違っているわけではありません。また、RuntimeException(つまり、チェックされていない) ため、まったくキャッチする必要がないため、問題ではありません。

今、それがチェックされた例外だった場合:

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

ここでsomeMethod、 try ブロックを呼び出して catch のみを呼び出した場合SomeSubCheckedException、コンパイラに関する限り、 is notsomeMethodのインスタンスをスローする可能性があるため、コードはコンパイルに合格しSomeCheckedExceptionませんSomeSubCheckedException

于 2014-12-17T10:46:21.590 に答える
0

特定の実装を見るべきではありません。ドキュメントには がスローされると書かれていますがIndexOutOfBoundsException、これを処理したい場合 (これは実際には必要ありません)、それをキャッチしたほうがよいでしょう。

チェックを行わず、単に配列アクセスを throwArrayIndexOutOfBoundsExceptionにする別の Java 実装が存在する可能性があります。または、次のバージョンで Oracle がそれを行うことを決定する可能性があります。

処理StringIndexOutOfBoundsExceptionするだけで、API ドキュメントで説明されている一般的な契約ではなく、特定の実装に結び付けられます。

上記の私の例は純粋に仮説にすぎません. のドキュメントはそれをスローする必要がStringIndexOutOfBoundsExceptionあることをしっかりと確立していますが、一般的なルールとして: 契約に従ってください.String

于 2014-12-17T10:44:52.763 に答える
0

これは、スローされた最も近い例外にすぎません。いつでもできるのに、非常に多くの組み込み Exception クラスを持つ必要があるのはなぜですかthrow/use Exception class

ArrayIndexOutOfBoundsException同様StringIndexOutOfBoundsExceptionに、文字列などで作業する場合は、配列を使用します。

詳細はこちら

于 2014-12-17T10:44:23.467 に答える
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)

それは間違っていません。あくまで設計上の考慮事項です。IOExceptionとについても同様FileNotFoundExceptionです。

于 2014-12-17T10:44:38.687 に答える
0

いいえ、間違っていません。ただし、配列のインデックス付けやリストのインデックス付けなど、文字列のインデックス付けを使用するメソッドがない限り、いくつかのキーストロークを節約して IndexOutOfBoundsException を使用するだけで済みます。その後、ケースを異なる方法で処理するために例外の種類を区別できます。

于 2014-12-17T10:41:40.557 に答える