スキャナーでファイルを読み込んでいるときに、プログラムで実行時例外が発生しました。
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");
}
Scanner
では、hasNextLine()
の次の行があるかどうかを確認する必要があります
ループは
while(sc.hasNextLine()){
str=sc.nextLine();
//...
}
EOF
でnullを返すのはリーダーです
もちろん、このコードの一部では、入力が適切にフォーマットされているかどうかに依存します
nextLine()
を呼び出しており、javadocの説明どおりに、行がないときに例外をスローしています。 null
を返すことはありません
http://download.Oracle.com/javase/1,5.0/docs/api/Java/util/Scanner.html
何らかの理由で、Scannerクラスは、読み取ることができない特殊文字に遭遇した場合にもこの同じ例外を発行します。 hasNextLine()
への各呼び出しの前にnextLine()
メソッドを使用する以外に、正しいエンコードがScanner
コンストラクターに渡されることを確認してください。例:
Scanner scanner = new Scanner(new FileInputStream(filePath), "UTF-8");
実際の問題は、行数よりも多く「sc.nextLine()」を呼び出していることです。
たとえば、入力行が10行しかない場合、「sc.nextLine()」を10回しか呼び出せません。
「sc.nextLine()」を呼び出すたびに、1つの入力行が消費されます。 「sc.nextLine()」を行数よりも多く呼び出すと、「Java.util.NoSuchElementException:No line found」という例外が発生します。
"sc.nextLine()" n回呼び出す必要がある場合、少なくともn行が必要です。
"sc.nextLine()"を呼び出す回数と行数が一致するようにコードを変更してみてください。問題が解決されることを保証します。
私もその問題に直面しています。私の場合、問題は、いずれかのfuncs内でスキャナーを閉じたことです。
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ループ内から1回
while (sc.hasNextLine()) {sc.nextLine()...}
whileを使用して、先読みするだけ1行。次にsc.nextLine()を使用して2 whileループに先読みを要求した単一行の前の行を読み取ります。
また、複数の[〜#〜] if [〜#〜]ステートメントをIF、ELSEに変更して、複数行も読み込まないようにします。