Java扫描程序异常

时间:2016-09-09 16:36:52

标签: java java.util.scanner

我正在尝试编写一个程序,我将文本文件复制到另一个文件中。在这个其他文件中,我希望第一行有一个单词,第二行有两个单词,第三行有三个,依此类推。

但是我在使用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();
  }
}

3 个答案:

答案 0 :(得分:2)

如果没有NoSuchElementException元素,则会引发next()。当您检查文件hasNext()是否位于金字塔每个图层的开头时,您还需要在next()循环中调用for之前进行检查。您的异常会在for循环中抛出,因为金字塔的下一层可能需要比文件中剩余更多的单词,导致next()尝试获取不存在的元素。

要解决此问题,请使用forif(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;
  }
}
相关问题