提问人:Ashish Panery 提问时间:8/27/2011 最后编辑:Michael MyersAshish Panery 更新时间:3/11/2023 访问量:340789
java.util.NoSuchElementException:未找到行
java.util.NoSuchElementException: No line found
问:
当我通过扫描仪读取文件时,我的程序中出现了运行时异常。
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");
}
答:
您正在调用,当没有行时它会抛出异常,正如 javadoc 所描述的那样。它永远不会回来nextLine()
null
https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html
与你需要检查是否有下一行Scanner
hasNextLine()
所以循环变成了
while(sc.hasNextLine()){
str=sc.nextLine();
//...
}
是读取器返回 null onEOF
当然,在这段代码中,这取决于输入的格式是否正确
无论出于何种原因,如果 Scanner 类遇到无法读取的特殊字符,它也会发出相同的异常。除了在每次调用 之前使用该方法之外,请确保将正确的编码传递给构造函数,例如:hasNextLine()
nextLine()
Scanner
Scanner scanner = new Scanner(new FileInputStream(filePath), "UTF-8");
您真正的问题是您调用“sc.nextLine()”的次数多于行数。
例如,如果您只有 10 个输入行,那么您只能调用 “sc.nextLine()” 十次。
每次调用“sc.nextLine()”时,都会消耗一行输入。如果调用“sc.nextLine()”的次数多于行数,则会出现一个名为
"java.util.NoSuchElementException: No line found".
如果必须调用“sc.nextLine()”n次,则必须至少有n行。
尝试更改您的代码以匹配您调用“sc.nextLine()”的次数与行数,我保证您的问题将得到解决。
我也遇到过这个问题。 就我而言,问题是我在其中一个函数中关闭了扫描仪。
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();
}
}
上面的代码做了同样的说明,解决方案是只在主屏幕上关闭扫描仪一次。
评论
需要使用顶部注释,但也要注意 nextLine()。要消除此错误,请仅调用
sc.nextLine()
一次从你的while循环中
while (sc.hasNextLine()) {sc.nextLine()...}
您只使用 while 向前看 1 行。然后使用 sc.nextLine() 读取您要求 while 循环向前看的单行前面的 2 行。
此外,将多个 IF 语句更改为 IF、ELSE,以避免同时读取多行。
我遇到了这个问题,我的结构是: 1 - 系统 2 - 注册 <-> 3 - 验证
我在 3 个步骤中的每一个步骤都关闭了扫描仪。我开始仅在系统中关闭扫描仪,它解决了。
评论
sc