0

この問題により、次のコードの抜粋で無限ループが発生します。

    public static final List<String> extractTags(String source, Integer nTags) {

    List<String> tags = new ArrayList<>();

    try (StringReader stringReader = new StringReader(source)) {
      String tag = "";
      char c;
      while ((c = (char) stringReader.read()) >= 0 && tags.size() < nTags) {
        switch (c) {
        case '<':
          tag = "";
          break;
        case '>':
          tags.add(tag);
          break;
        default:
          tag = tag + c;
          break;
        }
      }
    } catch (IOException e) {
    } finally {
      return tags;
    }
  }

次のパラメータで呼び出された場合: source = "trash" nTags = 2

デバッガーを使用して、文字列が完全に反復された後、read() メソッドが char '\uFFFF' 65535 を永久に返すことに気付きました。だから私の質問はなぜですか?

ありがとう!

4

2 に答える 2

4

ストリームの終わりにstringReader.read()返されるため、Java で唯一の符号なしデータ型にキャストしています。そのため、ストリームの終わりを取得する代わりに、while ループを壊すことはありません。-1char-165535

while 条件ではなく、ループchar で読み取ったものをキャストしたい場合があります。

于 2016-11-16T12:59:04.117 に答える