java.util.NoSuchElementException:未找到行

java.util.NoSuchElementException: No line found

提问人:Ashish Panery 提问时间:8/27/2011 最后编辑:Michael MyersAshish Panery 更新时间:3/11/2023 访问量:340789

问:

当我通过扫描仪读取文件时,我的程序中出现了运行时异常。

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");
}
java.util.scanner

评论

10赞 Jim Garrison 8/27/2011
欢迎来到 SO。发布代码时,应注意格式化其可读性......即删除不必要的空行,正确缩进。此外,将堆栈跟踪格式化为代码以使其可读。我为您修复了格式。
9赞 Jim Garrison 8/27/2011
另外,你遗漏了最重要的部分,即如何声明和打开。sc

答:

18赞 Brian Roach 8/27/2011 #1

您正在调用,当没有行时它会抛出异常,正如 javadoc 所描述的那样。它永远不会回来nextLine()null

https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html

53赞 ratchet freak 8/27/2011 #2

与你需要检查是否有下一行ScannerhasNextLine()

所以循环变成了

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

是读取器返回 null onEOF

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

8赞 Luís de Sousa 2/3/2016 #3

无论出于何种原因,如果 Scanner 类遇到无法读取的特殊字符,它也会发出相同的异常。除了在每次调用 之前使用该方法之外,请确保将正确的编码传递给构造函数,例如:hasNextLine()nextLine()Scanner

Scanner scanner = new Scanner(new FileInputStream(filePath), "UTF-8");

8赞 William Hou 9/19/2017 #4

您真正的问题是您调用“sc.nextLine()”的次数多于行数。

例如,如果您只有 10 个输入行,那么您只能调用 “sc.nextLine()” 次。

每次调用“sc.nextLine()”时,都会消耗一行输入。如果调用“sc.nextLine()”的次数多于行数,则会出现一个名为

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

如果必须调用“sc.nextLine()”n次,则必须至少有n行。

尝试更改您的代码以匹配您调用“sc.nextLine()”的次数与行数,我保证您的问题将得到解决。

22赞 agr 12/7/2018 #5

我也遇到过这个问题。 就我而言,问题是我在其中一个函数中关闭了扫描仪。

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();
    }
}

上面的代码做了同样的说明,解决方案是只在主屏幕上关闭扫描仪一次。

评论

0赞 AWGAL 11/4/2019
谢谢那个朋友,坚持这个小错误
7赞 Kaushik Evani 11/14/2019
我有类似的问题。我想知道为什么如果我关闭扫描仪并在阅读下一行时再次重新初始化它,它将不起作用。它们都应该是扫描仪的不同实例,对吧?为什么关闭一个扫描程序实例会影响另一个扫描程序实例?
0赞 Adam M. Erickson 9/11/2019 #6

需要使用顶部注释,但也要注意 nextLine()。要消除此错误,请仅调用

sc.nextLine()

一次从你的while循环中

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

您只使用 while 向前看 1 行。然后使用 sc.nextLine() 读取您要求 while 循环向前看的单行前面的 2 行。

此外,将多个 IF 语句更改为 IF、ELSE,以避免同时读取多行。

0赞 Luís Fernandes 6/6/2022 #7

我遇到了这个问题,我的结构是: 1 - 系统 2 - 注册 <-> 3 - 验证

我在 3 个步骤中的每一个步骤都关闭了扫描仪。我开始仅在系统中关闭扫描仪,它解决了。

评论

1赞 Community 6/6/2022
正如目前所写的那样,你的答案尚不清楚。请编辑以添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。您可以在帮助中心找到有关如何写出好答案的更多信息。