我正在尝试编写一个程序,我将文本文件复制到另一个文件中。在这个其他文件中,我希望第一行有一个单词,第二行有两个单词,第三行有三个,依此类推。
但是我在使用Scanner课时遇到了一些麻烦。在下面的程序中,我一直得到第14行的NoSuchElementException。我认为这是因为我在while循环中关闭了扫描器或者某些东西,但即使我遗漏了' in.close()'我一直得到同样的错误。
有人可以帮我吗?
提前致谢。
import java.io.*;
import java.util.*;
public class WordPyramid {
public static void main(String[] args) throws FileNotFoundException {
File inputFile = new File(args[0]);
Scanner in = new Scanner(inputFile);
PrintWriter out = new PrintWriter(args[1]);
int s = 1;
int i = 0;
while (in.hasNext()) {
if (s >= i) {
for (i = 1; i <= s; i++) {
out.print(in.next());
out.print(" ");
}
out.println("");
s++;
}
}
in.close();
out.close();
}
}
答案 0 :(得分:2)
如果没有NoSuchElementException
元素,则会引发next()
。当您检查文件hasNext()
是否位于金字塔每个图层的开头时,您还需要在next()
循环中调用for
之前进行检查。您的异常会在for
循环中抛出,因为金字塔的下一层可能需要比文件中剩余更多的单词,导致next()
尝试获取不存在的元素。
要解决此问题,请使用for
将if(in.hasNext())
循环包裹在内部。
答案 1 :(得分:1)
hasNext()
检查扫描程序的流中是否还有一个令牌。您正在检查是否还有一个令牌,然后假设您的for循环中有多个令牌。我会修改你的for循环看起来像这样:
for (i = 1; i <= s && in.hasNext(); i++)
答案 2 :(得分:0)
我想建议您的循环可能过于复杂。
以下是我认为更简单的答案,并避免您的例外:
File inputFile = new File(args[0]);
Scanner in = new Scanner(inputFile);
PrintWriter out = new PrintWriter(args[1]);
int s = 1;
int i = 0;
while (in.hasNext()) {
out.print(in.next() + " ");
i++;
if (i == s)
{
// Start the next line
out.println();
s++;
i = 0;
}
}