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()正在返回-1流结束,但您将其强制转换为charJava 中唯一的无符号数据类型。因此,-1您不会得到65535流结束,因此永远不会破坏 while 循环。

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

于 2016-11-16T12:59:04.117 回答
0

使其细化 countTags(String source); => 使用此方法仅计算标签。extractTags(String source) => 确定你的标签是什么或你的标签不是什么然后提取标签或提取哪些标签不是。

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

一些有趣的事情:你可以在开始和结束时执行 string.length 并减去以在 extract 方法中找到标签的数量,这会给你计数。

你也不需要一个while循环

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

于 2018-08-30T15:51:53.007 回答