线程“主”中的异常java.util.NoSuchElementException
该文档中有500行,但仅标记300 ++行。
s3 = itr.nextToken(); //这是出现错误的行。控制台在此行显示该错误。
public class bigram {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new FileReader("Airline.txt"));
FileOutputStream out = new FileOutputStream("Airline2.txt");
ArrayList < String > bigrams = new ArrayList < String > ();
while (true) {
String line = reader.readLine();
if (line == null) {
break;
}
StringTokenizer itr = new StringTokenizer(line);
if (itr.countTokens() > 1) {
System.out.println("String array size : " + itr.countTokens());
String s1 = "";
String s2 = "";
String s3 = "";
String s4 = "";
while (itr.hasMoreTokens()) {
if (s1.isEmpty())
s1 = itr.nextToken();
if (s2.isEmpty()) {
s2 = itr.nextToken();
}
s3 = itr.nextToken(); // This is the line that got error.
s4 = "'" + s1 + "_" + s2 + "_" + s3 + "'";
bigrams.add(s4);
s1 = s2;
s2 = s3;
s3 = "";
}
} else
System.out.println("Tokens is 1 or 0");
int i = 0;
while (i < bigrams.size()) {
System.out.println(bigrams.get(i));
i++;
}
//bigrams = Arrays.asList(i);
for (String s: bigrams) {
PrintStream p = new PrintStream(out);
p.println(s);
System.out.println(s);
}
}
}
}
答案 0 :(得分:0)
您的问题出在代码的这一部分:
// previous code
while (itr.hasMoreTokens()) {
if(s1.isEmpty())
s1 = itr.nextToken();
if(s2.isEmpty()) {
s2 = itr.nextToken();
}
s3 = itr.nextToken();
// further code
假设迭代器中只剩下 一个令牌,因此while (itr.hasMoreTokens())
将返回true。
现在假设s1
为空,因此itr.nextToken();
将为其赋予最后一个标记。
现在假设s2
也为空,因此此itr.nextToken();
将尝试再给它一个令牌,但它为空。如果没有,则s3
不会被检查,itr
肯定会尝试从一个空的迭代器中为其赋予一个令牌。
NoSuchElementException
由 Enumeration 的nextElement
方法抛出,表示enumeration
中没有更多元素。
您需要根据要达到的目标进行更好的检查。建议您在循环中仅在迭代器上调用.next...()
,除非您非常了解文件。
编辑:
如果绝对必须循环调用next()
3次,则需要在尝试next()
之前显式检查它们是否是更多令牌,如下所示:
if (sX.isEmpty()) {
if (itr.hasMoreTokens()) {
s1 = itr.nextToken();
} else {
// no more tokens
break;
}
}
希望这会有所帮助。祝你好运。