使用Scanner.next()进行StreamIO时的Java NoSuchElementException

时间:2015-03-26 00:30:37

标签: java inputstream java.util.scanner nosuchelementexception

我正在第一次涉足StreamIO。我有一个文本文件(用户输入的名称),我可以使用此代码正确阅读:

 Scanner inputStream = null;    
 **Prompt user for fileName, check if exists etc.**

 try {    
      inputStream = new Scanner(new File(fileName));
      inputOpen = 1;
 }
 catch(FileNotFoundException e) {
       System.out.println("Error opening the file " + fileName);
 }
 catch (IOException e) {
       System.out.println("Unkown errow with the file " + fileName);
 }

 while(inputStream.hasNextLine()) {
       String line = inputStream.nextLine();
       System.out.println(line);
 }

根据我的任务,我需要在文件中循环输入文本并忽略空格,然后以一定长度的行输出(由用户设置)。所以我使用while循环去EOF,从文本中获取下一个单词,将其添加到一行并测试该长度。如果它适合,我将它添加到行,如果它超过我打印当前行并开始下一行。所以我现在正在使用它:

 while(inputStream.hasNextLine()) {
        String line = null, lineTest = null;

        String word = inputStream.next();
        lineTest = (lineTest + " " + word);
        if (lineTest.length() > width) {
            outputStream.println(line);
            line = word;
        }
        else
            line = (line + " " + word);      
    }

我得到了这一行的NoSuchElementException:String word = inputStream.next();

我不能很好地理解这个例外来诊断它。从它是什么样的,我试图扫描那些不存在的东西,比如过去的EOF。我认为我的while循环是正确的,那还有什么呢?

2 个答案:

答案 0 :(得分:0)

hasNextnext一起使用。将hasNextLinenextLine一起使用。

可能存在下一行,但不是下一个单词 - 例如,如果文件中的最后一行是空白的。然后nextLine将返回空行,但next会抛出异常,因为没有更多的单词。

答案 1 :(得分:0)

几乎immibus所说的。 添加例如:

想象一下,你使用nextInt()

从键盘输入中请求一个int

用户在一行输入数字'8'。虽然nextInt()将返回用户输入的'8',但未读取输入中的新行字符“\ n”,因为它出现在int之后。

在用户输入之后有一个隐含的“\ n”,并且任何事情,但是nextLine()将拾取所有内容但是“\ n”。因此nextInt()将获取int,next()将获取一个单词,依此类推。

所以,如果在你向用户询问某个输入而不是nextLine()之后,然后你的下一个请求在程序中的任何其他位置是nextLine(),那么nextLine()方法将返回隐含的“\ n”用户输入的最后一行(因为从未返回此“\ n”)。我希望我有意义。感觉有点难以描述。

一个具体的例子:

int a = kb.nextInt();  //user enters the integer 8 and presses ENTER, creating a new line in the input stream which you must keep track of
String text = kb.nextLine(); //  user enters any string

int'a'将存储整数8,'text'将存储简单的“\ n”。这是因为如果您允许用户在语句之间按下输入(例如,如果您在不同时间询问),那么用户输入就是字面意思:“8”+“\ n”+“用户输入字符串”+“\ n”< / p>

所以nextInt()之后的nextLine()会在8之后获取“\ n”而不是“用户输入字符串”之后的那个!

为避免这种情况,我通常会这样做:

int a = kb.nextInt();
kb.nextLine(); //simply grabs the "\n" after any integer is entered
String text = kb.nextLine()

这样你就可以抓住你想要获得的那条线。

我使用了用户输入示例,因为它更直观,但当然相同的概念适用于使用类Scanner的对象从文本文件解析的文本。你测试了一个hasNnextLine()的文件,它确实有一个;它可能只是:“\ n” - &gt;文件结束 所以它有一个nextLine(),但它没有next()。这就是问题所在。

很抱歉对一个相对简单的问题给出了很长的答案。