这个问题导致以下代码摘录中的无限循环:
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;
}
}
如果用以下参数调用:来源= "垃圾"nTags = 2
使用调试器,我意识到在字符串完全迭代后,read()方法永远返回char 'uFFFF' 65535。我的问题是为什么?
谢谢!
因为stringReader.read()
为流结束返回-1
,但您将其转换为char
,这是Java中唯一的无符号数据类型。所以你得到的不是-1
,而是65535
作为流的结束,因此永远不会打破while循环。
在循环中,而不是在while条件下,您可能希望将读取到的内容强制转换为char
。
使其粒度化countTags(字符串源);=>使用此方法仅计数标签。extractTags(字符串源)=>确定你的标签是什么或你的标签不是什么,然后提取标签或提取标签不是什么。
重建不带标签的字符串/在提取时重建。StringBuilder/StringReader不是必需的。
一些有趣的东西:你可以做字符串。长度当你开始&当你结束并减去在提取方法中找到标签的数量,这将给你计数。
你也不需要这个
的while循环对于您的实际问题:您可能想要查看需要转义的字符。