此问题导致以下代码摘录中的无限循环:
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。所以我的问题是为什么?
谢谢!
答案 0 :(得分:4)
因为stringReader.read()
正在为流末尾返回-1
,但是您将它转换为char
,这是Java中唯一的无符号数据类型。因此,代替-1
,您将获得65535
作为流的结尾,因此永远不会破坏while循环。
您可能希望将读取的内容转换为1}} 内部循环,而不是在while条件下。
答案 1 :(得分:0)
使其细化 countTags(String source); =>使用此方法仅计算标签。 extractTags(String source)=>识别您的标签是什么或什么不是您的标签,然后提取标签或提取什么标签。
重建不带标签的字符串/在提取时重建。.不需要StringBuilder / StringReader。
一些有趣的事情:您可以在开始时和结束时执行string.length,然后减去以在extract方法中找到标记数,从而获得计数。
您也不需要while循环
对于您的实际问题:您可能希望调查需要转义的字符。