java.util.NoSuchElementException:未找到行

xxb16uws  于 2023-02-21  发布在  Java
关注(0)|答案(7)|浏览(122)

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

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");
}
hpcdzsge

hpcdzsge1#

对于Scanner,您需要检查是否存在下一行hasNextLine()
所以这个循环变成了

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

EOF上返回null的是读取器
当然,在这段代码中,这取决于输入的格式是否正确

brvekthn

brvekthn2#

我也遇到了这个问题。在我的例子中,问题是我关闭了其中一个函数内的扫描仪。

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

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

kdfy810k

kdfy810k3#

您正在调用nextLine(),它在没有行时抛出异常,正如javadoc所描述的那样,它永远不会返回null
https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html

pxq42qpu

pxq42qpu4#

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

r7s23pms

r7s23pms5#

您真实的的问题是调用“sc.nextLine()”的次数多于行数
例如,如果您只有TEN个输入行,那么您只能ONLY调用“sc.nextLine()”TEN次。
每次调用“sc.nextLine()"时,将消耗一个输入行。如果调用“sc.nextLine()”的次数**超过行数,将出现名为的异常

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

如果你必须调用“sc.nextLine()”*n*次,那么你必须有至少 n行。
尝试更改代码,使调用“sc.nextLine()”的次数与行数相匹配,我保证您的问题将得到解决。

nlejzf6q

nlejzf6q6#

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

sc.nextLine()

一次来自while循环

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

您使用while只向前看1行。然后使用sc.nextLine()读取您要求while循环向前看的单行之前的2行。
另外,将多个IF语句更改为IF,ELSE,以避免阅读多行。

kyks70gy

kyks70gy7#

我遇到了这个问题,我的结构是:1 -系统2 -配准<->3 -验证
我正在关闭扫描仪的每一个3个步骤。我开始关闭扫描仪只在系统和它解决。

相关问题