web-dev-qa-db-ja.com

Javaでは、部分文字列で負の値を使用できますか?

Javaでstring.substringの終了インデックスとして負の値を使用できますか?

例:

String str = "test";
str.substring(0, str.indexOf("q"));

編集:javadocsのどこにもendindexを負にすることはできません。負のendindexを許可するがdisallowは負のbeginindexを許可する他の言語やライブラリでの部分文字列の実装があるため、これを明示的に述べることは関連があるようです。それは決して暗示されていません。 (編集:わかりました、それは大まかに暗示されていますが、私とこの質問を直接私に尋ねた他の人は、まだそれがかなり不明確であると感じています。この些細な質問)

19
Slight

いいえ。負のインデックスはできません

From String#substring(int beginIndex、int endIndex)

スロー:IndexOutOfBoundsException-beginIndexが負の場合、またはendIndexがこのStringオブジェクトの長さより大きい場合、または beginIndexがendIndexより大きい。

ドキュメントはendIndexが負であってはならないことを直接述べていませんが1、これは導出できます。関連する要件を書き換えると、次の事実が生じます。

  1. "beginIndexは負にできません"-> _beginIndex >= 0_
  2. "beginIndexはendIndex以下でなければなりません"-> _endIndex >= beginIndex_

したがって、_endIndex >= beginIndex >= 0_は、endIndexを負にできないことができないことを意味する要件です。


とにかく、str.substring(0, -x)は、負の終了インデックスが何を意味するかについて同じ考えを持っていると仮定すると、str.substring(0, str.length() - x)として簡単に書き直すことができます。もちろん、当初の制限要件は依然として適用されます。


1 奇妙なことに、 _String#subSequence_doesは負のendIndexを明示的に禁止しています。そのため、両方のメソッドが同じ簡略化された前提条件テキストを共有するようにドキュメントをクリーンアップできると感じています。 (おまけとして、「Java 7」サブシーケンスのドキュメントには重要なタイプミスもあります。)

37
user2864740

No、部分文字列のendindexに負の数、および文字列の長さより大きい数を使用すると、StringIndexOutOfBoundsExceptionが発生します。

(ネットでこれに対する正解を見つけるのがどれほど難しいか信じられないでしょう)

3
Slight