2016-08-22 11 views
1

私は、次の式があります。これはなぜ例外をスローしませんか?

String y = new String("a") + "b".substring(1,1) + "c".concat("d").toUpperCase(); 

コードがコンパイルされ、成功した「ACD」を出力します。私の質問は、なぜですか?

JLSによれば、式を評価する前にオペランドを左から右に評価する必要があります。つまり、 "b" .substring(1,1)はIndexOutOfBoundsExceptionをスローする必要があります。代わりに、それはちょうど価値を捨てているようだ。

"aCD"の結果を引き起こすJavaは何ですか?

注 - これは決して実際には行いません。私は好奇心を満足させようとしています。

+9

'' b ".substring(1,1)'は 'IndexOutOfBoundsException'をスローするべきだと思いますか? – Pshemo

+5

"beginIndexが負の場合、またはendIndexがこのStringオブジェクトの長さより大きい場合、またはbeginIndexがendIndexより大きい場合。それは真実ではありません。 – Marvin

+0

length == 1. beginIndex == 1、endIndex == 1。どのルールに違反していますか? –

答えて

3

ので、それが例外をスローしないでください。

  1. beginIndexが負の値ではありません。
  2. endIndexはStringの長さを超えません。
  3. beginIndexはendIndexより大きくありません。

beginIndexが "1" であり、負でない

"b" has a length of 1, a begin index of 0. 

"b".substring(1,1); 
  1. を説明するために。
  2. endIndex "1"は文字列 "1"の長さより大きくありません。
  3. beginIndex "1"はendIndex "1"より大きくありません。

文字列 ""の返信が保証されているので、このコードは愚かであることに完全に同意します。ただし、これらのインデックスが計算される状況は多くあり、そのような状況の中には、例外の代わりに空の文字列を返すことができるようにするのは非常に意味があります。

+0

これは明らかだったはずです - 私は木々を通して森を見ることができませんでした。 – kjl

+0

2番目のインデックスは排他的で、1つは理由があるかもしれないので、例外をスローするのは当然のことです* "私は包括的だと思うが、インデックスの値を1つ減らす" * * "インデックス1で始まり、インデックス0で終わる" *。しかし、私は0.999 ...と1.00 ...は結局同じ数字だと思うので、その時点で重複しています。 – Gendarme

+0

@kjl全く問題ありません。私はどのように捨てられるのかを簡単に見ることができます。終了文字を含まないJavaの終了インデックスは、通常は文字列処理で続く「すべてから1を引く」ロジックを行わないようにするが、誤解を招く。 "startIndex"が文字列の "終わり"に効果的に来ることを許しているのはもう一つの奇妙なことですが、再びそれを解析するときに定型コードをたくさん避けるのに役立ちます。 –

関連する問題