-3

次のシナリオを検討してください。

String str = "str";
System.out.println("str subs: " + str.substring(3,3));

期待される結果:
StringIndexOutOfBoundsException (beginIndex は文字列が終了した「後に」開始されるため)

実際の結果:
空の文字列が出力されます

String.javaから:

public String substring(int beginIndex, int endIndex) {
    if (beginIndex < 0) {
        throw new StringIndexOutOfBoundsException(beginIndex);
    }
    if (endIndex > count) {
        throw new StringIndexOutOfBoundsException(endIndex);
    }
    if (beginIndex > endIndex) {
        throw new StringIndexOutOfBoundsException(endIndex - beginIndex);
    }
    return ((beginIndex == 0) && (endIndex == count)) ? this :
        new String(offset + beginIndex, endIndex - beginIndex, value);
}


beginIndex == endIndex == count (countは文字列の長さ)というエッジ ケースに実装が対応していないことは簡単にわかります。

マニュアルによると、メソッドの部分文字列:

この文字列の部分文字列である新しい文字列を返します。部分文字列は、指定された beginIndex で始まり、インデックス endIndex - 1 の文字まで拡張されます。したがって、部分文字列の長さは endIndex-beginIndex になります。

また、メソッドがスローすることも述べています。

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

case: as valid を考慮することは理にかなっていますか? 何か不足していますか?beginIndex == endIndex == count

4

3 に答える 3

7
"abc".substring(3,3) == ""

あなたが言ったように、マニュアルを見てみましょう:

この文字列の部分文字列である新しい文字列を返します。

わかった

部分文字列は、指定された beginIndex で始まり、インデックス endIndex - 1 の文字まで拡張されます。

文字列の長さに関係なく、この文の解釈は困難です。しかし、空の文字列がこれに違反しないことに同意できると思います。

したがって、部分文字列の長さは endIndex-beginIndex です。

わかった

例外: IndexOutOfBoundsException - beginIndex が負の場合

そうではない

または endIndex がこの String オブジェクトの長さより大きい

そうではない

または beginIndex が endIndex より大きい。

そうではない。

行動は私には約束されているようです。

次のようにも表示できます。文字列"abc"には 4 つの空の部分文字列が含まれています。文字の間に 2 つ、最初に 1 つ、最後に 1 つです。これらには、それぞれ、、、を介しsubstringてアクセスできます。次のコードとも比較してください1,12,20,03,3

class EmptyTest {

    public static void main (String[] args) {

         Matcher m = Pattern.compile("").matcher("abc");
         while (m.find()) {
            System.out.println(m.start() + "," + m.end());
         }
    }
}

印刷する

0,0
1,1
2,2
3,3
于 2013-11-11T09:07:35.850 に答える
2

beginIndex == endIndex == count仮想の「開始カーソル」が文字列の最後の文字の直後、「終了カーソル」と同じポイントに配置されることを意味するため、長さゼロの文字列が得られます。に対して空の文字列を返すのと同じくらい有効なようです(0,0)

于 2013-11-11T06:39:22.477 に答える
0

この動作は、次のものと一致しています。

String str = "str";
System.out.println("str subs: " + str.substring(2,2));

また、部分文字列ではなく空の文字列を返します。空集合はすべての集合の部分集合です。

クラス java.lang.String を参照 パラメータ: beginIndex 開始インデックス (両端を含む)。

于 2013-11-11T06:48:29.820 に答える