Java.util.NoSuchElementException: 找不到任何行

58

在使用Scanner读取文件时,我的程序出现了运行时异常。

java.util.NoSuchElementException: No line found     
   at java.util.Scanner.nextLine(Unknown Source)    
   at Day1.ReadFile.read(ReadFile.java:49)  
   at Day1.ParseTree.main(ParseTree.java:17) 

我的代码如下:

while((str=sc.nextLine())!=null){
    i=0;
    if(str.equals("Locations"))
    {
        size=4;
        t=3;
        str=sc.nextLine();
        str=sc.nextLine();
    }
    if(str.equals("Professions"))
    {
        size=3;
        t=2;
        str=sc.nextLine();
        str=sc.nextLine();
    }
    if(str.equals("Individuals"))
    {
        size=4;
        t=4;
        str=sc.nextLine();
        str=sc.nextLine();
    }

int j=0;
String loc[]=new String[size];
while(j<size){
    beg=0;
    end=str.indexOf(',');
    if(end!=-1){
        tmp=str.substring(beg, end);
        beg=end+2;
    }
    if(end==-1)
    {
        tmp=str.substring(beg);
    }
    if(beg<str.length())
        str=str.substring(beg);
    loc[i]=tmp;
    i++;

    if(i==size ){
        if(t==3)
        {
            location.add(loc);
        }
        if(t==2)
        {
            profession.add(loc);
        }
        if(t==4)
        {
            individual.add(loc);
        }
        i=0;
    }
    j++;
    System.out.print("\n");
}

10
欢迎来到SO。当发布代码时,请注意将其格式化以便阅读,即删除不必要的空白行,适当缩进。同时,将堆栈跟踪格式化为代码形式以使其易读。我已经为您修复了格式。 - Jim Garrison
9
你漏掉了最重要的部分,即如何声明和打开 sc - Jim Garrison
7个回答

53

使用Scanner时,你需要使用hasNextLine()来检查是否有下一行。

因此,循环变为

while(sc.hasNextLine()){
    str=sc.nextLine();
    //...
}

EOF时返回null的是读取器。

当然,在这段代码中,这取决于输入是否格式正确。


22

我也遇到过这个问题。 在我的情况下,问题是我在一个函数中关闭了Scanner。

public class Main 
{
    public static void main(String[] args) 
    {
        Scanner menu = new Scanner(System.in);
        boolean exit = new Boolean(false);
        while(!exit) {
            String choose = menu.nextLine();
            Part1 t=new Part1()
            t.start();
            System.out.println("Noooooo Come back!!!"+choose);
        }
        menu.close();
    }
}

public class Part1 extends Thread 
{
    public void run()
    { 
        Scanner s = new Scanner(System.in);
        String st = s.nextLine();
        System.out.print("bllaaaaaaa\n" + st);
        s.close();
    }
}

以上代码引发了相同的异常,解决方案是在主函数中仅关闭一次扫描器。

谢谢你,伙计。我被这个小错误卡住了。 - AWGAL
7
我遇到了类似的问题。我想知道,如果我在读取下一行时关闭扫描器并重新初始化它,为什么它就无法工作呢?它们应该是两个不同的扫描器实例,对吧?为什么关闭一个扫描器实例会影响另一个实例呢? - Kaushik Evani
https://dev59.com/hVwX5IYBdhLWcg3wpw1h - semaphore
https://stackoverflow.com/questions/33555283/why-is-not-possible-to-reopen-a-closed-standard-stream - undefined

18

8
无论何种原因,如果Scanner类遇到无法读取的特殊字符,它也会引发相同的异常。在每次调用nextLine()之前使用hasNextLine()方法,并确保将正确的编码传递给Scanner构造函数,例如:
Scanner scanner = new Scanner(new FileInputStream(filePath), "UTF-8");

8

你的实际问题是你调用了 "sc.nextLine()" 的次数多于输入行数。

例如,如果你只有行输入,那么你只能调用 "sc.nextLine()" 次。

每次调用 "sc.nextLine()",都会消耗一行输入。如果你调用 "sc.nextLine()" 的次数超过输入行数,你会触发异常。

      "java.util.NoSuchElementException: No line found".

如果你必须调用"sc.nextLine()" n 次,那么你至少需要有n 行。

尝试更改你的代码,使得调用"sc.nextLine()"的次数与行数相匹配,我保证你的问题将会被解决。


0
我遇到了这个问题,我的结构是: 1 - 系统 2 - 注册 <-> 3 - 验证
我在每个步骤中都关闭了Scanner。我开始只在系统中关闭Scanner,问题得到了解决。

1
目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

0

需要使用顶部注释,但也要注意nextLine()。为了消除这个错误,只需调用

sc.nextLine()

在 while 循环内部执行一次

 while (sc.hasNextLine()) {sc.nextLine()...}

你正在使用while仅向前查看1行。然后使用sc.nextLine()来读取单行向前两行的内容。

同时将多个IF语句改为IF,ELSE,以避免读取不止一行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接