【发布时间】:2016-11-16 12:56:11
【问题描述】:
此问题导致以下代码摘录中的无限循环:
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。所以我的问题是为什么?
谢谢!
【问题讨论】:
-
return块中的finally语句是 bad idea。 -
你为什么不改用
String.charAt()? -
为什么 String.charAt 更好?
-
从易用性的角度来看,不一定更好。但是,使用 StringReader 迭代 String 是不常见的。可能是出于性能原因。 StringReader.read() 是通过在
synchronized块内调用 String.charAt() 来实现的。所以调用 charAt() 直接绕过了这个开销。
标签: java string stringreader