java.io.StringReader.read() (Java 8) returns 字符串末尾出现意外字符

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;
    }
  }

如果使用以下参数调用: 来源 = "trash" nTags = 2

使用调试器我意识到在字符串完全迭代后,read() 方法 returns char '\uFFFF' 65535 永远。所以我的问题是为什么?

谢谢!

因为 stringReader.read() 正在为流的结尾返回 -1,但是您将其转换为 char,这是 Java 中唯一的无符号数据类型。因此,您得到的不是 -1 而是 65535 作为流的结尾,因此永远不会中断 while 循环。

您可能希望将读取的内容转换为char循环内,而不是在 while 条件下。

细化 countTags(字符串来源); => 使用此方法仅对标签进行计数。 extractTags(String source) => 识别你的标签是什么或你的标签不是什么,然后提取标签或提取标签不是。

重建不带标签的字符串/提取时重建.. StringBuilder/StringReader 不是必需的。

一些有趣的事情:您可以在开始时和结束时执行 string.length 并减去提取方法中的标签数,这将为您提供计数。

你也不需要 while 循环

对于您的实际问题:您可能需要查看需要转义的字符。