はい、私はこの問題を解決する方法を知っています。私は、文字列クラスと文字列ビルダクラス間のAPIを見ていました。ここではどのような私の質問です:
StringBuilder sb = new StringBuilder("wibble");
String s = new String("wobble");
sb.charAt(index) //Can throw Index Out Of Bounds Exception
s.charAt(index) //Can throw Index Out of Bounds Exception
sb.substring(start, end) //Can throw STRING index out of bounds exception
s.substring(start, end) //Only throws Index out of Bounds Exception (no String)
それははIndexOutOfBoundsException対StringIndexOutOfBoundsExceptionををスローすることを決定したときに何も意味がないことです。はい、私はStringIndexは、サブ例外である知っています。同じ実装を持っているいくつかの方法では、StringBuilderのサブ例外をスローしながら文字列とStringBuilderの両方で、同一の実装を持っているいくつかの方法は、同じ例外をスローします。なぜそれがありますか?
答えとして、私は1つだけ選択することができていても答え2人の答えと感謝をスクロールする人々を保存するには、両方が明確に助けます。Java Oracleのドキュメント人々は、文字列のためのサブストリングにタイプミスをしました。StringIndexOutOfBoundsExceptionをすることになっています。StringBuilderの中のcharAt()と同じ
これは、あなたが使用しているJDK実装にダウンしています。
私はいくつかの掘削を行なったし、実装方法、見つかったpublic char charAt(int index)
ためStringBuilder
、クラスを。(注:私はOracleのJDK 1.8を使用しています)。
したがって、この場合には、StringBuilder
クラスがのサブクラスですAbstractStringBuilder
。これは、あなたがこれを見つけることができませんとして実装するプログラマの選択であるドキュメント。
私が見つかりました。charAt
機能が実装された上でAbstractStringBuilder
の基本クラス。ここに私のシステムから問題のコードのいくつかのスクリーンショットは、あります。(特定のJDKは、OracleおよびJava 1.8であることに注意してください)。
更新
私は実際には例外がスローされ、何か面白いが発見されたものをテストするためにいくつかのコードを実行しました。charAt()
私の環境での機能もスローしますjava.lang.StringIndexOutOfBoundsException
。ここで私はそれをテストするために走ったコードは次のとおりです。
public class StringVsStringBuilder {
public static void main(String[] args) {
StringBuilder builder = new StringBuilder("one");
String string = "two";
try {
builder.charAt(10); // Clearly out of bounds
} catch (IndexOutOfBoundsException e) {
System.out.println(String.format(
"Exception encountered accessing character out of index bounds on variable 'builder': %s",
e.getClass()
));
}
try {
string.charAt(10); // Clearly out of bounds
} catch (IndexOutOfBoundsException e) {
System.out.println(String.format(
"Exception encountered accessing character out of index bounds on variable 'string': %s",
e.getClass()
));
}
}
}
実行すると、ここでの出力は、(Windowsの10、64、OracleのJDK 1.8.0_191)です。
Exception encountered accessing character out of index bounds on variable 'builder': class java.lang.StringIndexOutOfBoundsException
Exception encountered accessing character out of index bounds on variable 'string': class java.lang.StringIndexOutOfBoundsException
Process finished with exit code 0
コメントからいくつかの質問に対処するために:
-
[
AbstractStringBuilder
]どの手段ドキュメントに我々はそれを使ってプログラムを書くことができないではないですか?一つは、通常、他の後に続きます。
AbstractStringBuilder
クラスはにプライベートでjava.lang
、それはそのパッケージの外側からアクセスすることができないことを意味し、パッケージ。あなたのコードでこのクラスをインポートして使用することはできないだろうとこれが意味。これは、システムの公開APIの一部ではないコードの一部の完璧な例である(この場合、JDK自体が)、その場合、それはいくつかの理由のために、文書化されません。- あなたはそれを使用することはできません
- 実装の詳細は、潜在的に絶えず変化する可能性が
- これは、公共のAPI(システムの文書化部分)の使用に影響を与えるべきではありません
-
場合
charAt()
でStringBuilder
投げStringIndexOutOfBoundsException
、なぜドキュメントは、単純に言うんIndexOutOfBoundsException
?それはの説明した動作であるので、これはある
charAt()
クラスの設計意図に基づいた機能。あなたは(だけではない、他のJavaクラスのような例外のサブクラスをいくつでも作成することができますのでfinal
)それはそれが最高限り、関数から返す(またはスロー)するものを選択するように実装するプログラマに常にあります契約に合意(インターフェース、ドキュメント仕様、抽象クラス、など)への関数が付着。あなたが今JDKを実装して、独自のサブクラス選ぶことができる、と述べた
IndexOutOfBoundsException
。このシナリオでスローすると。私が使用した場合StringBuilder.charAt()
、私のコードでそれは私の実装の詳細への依存から休憩を危険にさらすことなく、最大限の柔軟性/移植を可能にするので、私は、ドキュメントに記述された例外をキャッチします。常に他の実装が投げない可能性がある場合は、意味、スローされる可能性を知っていることを最も具体的な例外をキャッチしよう:私はここでの議論を残すように、全体の本は、このトピックに書かれているStringOutOfBoundsException
、あなたはより良いキャッチしますただIndexOutOfBoundsException
そのタイプ(またはそのサブクラス)であることが保証されているので。
アップデート2
この特定のケースでは、あなたはかなり私は上記のすべてを無視することができ、ちょうど次のように焦点を当てます:
charAt()
に記載のインターフェース方式ですjava.lang.CharSequence
。任意の実装クラスに対して、シーケンスの範囲外のインデックスにアクセスしようとするときに発生する問題がなることをこれが意味IndexOutOfBoundsException
。インターフェイスは、一般的な動作を説明し、この現象は、で定義されることが必要ではないString
、StringBuilder
、AlphabetSoup
または任意の他の特定の実装。これらimplsた場合。その例外のサブクラスを作成し、細かいそれぞれの場合のより具体的なエラー情報を与えることにしたが、それは一般的な契約を変更しません。あなたは、一般的な文字処理システムを記述している場合、あなたはおそらく、インターフェイスに書き込み、根底にあるのimplを気にしないだろう。その場合、あなただけの知っている(またはケア)についてのIndexOutOfBoundsException
何もありません。