此问题导致以下代码摘录中的无限循环:
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 =“杂质”nTags =2
使用调试器时,我意识到在字符串完全迭代之后,read()方法将永远返回char '\uFFFF‘65535。所以我的问题是为什么?
谢谢!
发布于 2016-11-16 12:59:04
因为stringReader.read()将返回流结束时的-1,但是您将它转换为char,这是Java中唯一的未签名数据类型。因此,与-1不同的是,您将获得流结束时的65535,因此永远不要中断while循环。
您可能希望将读取的内容转换到循环中的char中,而不是在while条件下。
发布于 2018-08-30 15:51:53
使其成为细粒度的countTags(字符串源);=>只使用此方法来计数标记。extractTags( source) =>识别您的标记是什么,或者您的标记不是什么,然后提取标记或提取没有的标记。
在解压时重新生成不带标记的字符串/重新生成。不需要StringBuilder/StringReader。
一些有趣的事情:您可以在启动时执行string.length &在结束和减去提取方法中查找标记数,这将给出计数。
您也不需要while循环来实现这个
对于您的实际问题:您可能需要查看需要转义的字符。
https://stackoverflow.com/questions/40632722
复制相似问题