簡體   English   中英

java.io.StringReader.read()(Java 8)在字符串末尾返回意外字符

[英]java.io.StringReader.read() (Java 8) returns unexpected character at the end of the String

此問題在以下代碼摘錄中導致無限循環:

    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。 所以我的問題是為什么?

謝謝!

因為stringReader.read()對於流的結尾返回-1 ,但是您將其強制轉換為char ,這是Java中唯一的未簽名數據類型。 因此,您將獲得65535而不是-1而不是-1 ,因此永不中斷while循環。

您可能希望將讀取的內容char轉換為循環char ,而不是while條件。

使它更精細countTags(String source); =>使用此方法僅計算標簽。 extractTags(String source)=>識別您的標簽是什么或什么不是您的標簽,然后提取標簽或提取什么標簽。

重建不帶標簽的字符串/在提取時重建。。不需要StringBuilder / StringReader。

一些有趣的事情:您可以在開始時和結束時執行string.length,然后減去以在extract方法中找到標記數,從而獲得計數。

你也不需要一會兒循環

對於您的實際問題:您可能希望調查需要轉義的字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM