-1

head が割り当てられている行で次の例外が発生しますが、その理由はわかりません。

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 44

の値として "{1,2},3" を使用するとs、デバッガーを実行してループをたどることができ、commaSpot5 になるように正しく割り当てられます。しかし、何らかの理由s.charAt(commaSpot))で、 s の長さが 7 文字であっても、5 が有効なインデックスであるとは考えていません。

int commaSpot = 0;
int bracePairs = 0;
for(int i = 0; i < s.length(); i++) {
   if(s.charAt(i) == '{') bracePairs++;
   if(s.charAt(i) == '}') bracePairs--;
   if(s.charAt(i) == ',' && bracePairs == 0) {
      commaSpot = i;
      break;
   }
}
head = s.substring(0, s.charAt(commaSpot));
tail = s.substring(s.charAt(commaSpot), s.length());
4

2 に答える 2

5

問題は、それ自体s.charAt(commaSpot)ではなく、結果を 2 番目の引数として使用していることです。commaSpotあなたがしたい:

head = s.substring(0, commaSpot);
tail = s.substring(commaSpot, s.length());

での文字列の値は気にしません。commaSpotむしろ、それがコンマであることを知っています (Unicode 値 44、したがって例外メッセージ)。commaSpot分割したい場所である、それ自体の価値を気にします。

于 2013-09-25T16:52:21.023 に答える
2

これらの行で

head = s.substring(0, s.charAt(commaSpot));
tail = s.substring(s.charAt(commaSpot), s.length());

s.charAt(commaSpot)インデックス位置のcharとして扱われる を返します。int実際のインデックスである を使用したいiので、その値のコピーを保持して使用します ( commaspot)。

于 2013-09-25T16:52:08.417 に答える