2011-08-26 9 views
23

スキャナでファイルを読み込んでいるときにプログラムで実行時例外が発生しました。java.util.NoSuchElementException:行が見つかりません

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

あなたのコードのすべてのスペースを削除してください...それはちょっと私の目を伸ばします。また、ここにあなたのコードを入力してください、それは私に宿題のように見えます。 –

+2

ようこそ。コードを投稿するときは、読みやすくするために書式を設定する必要があります。つまり、不要な空白行を削除し、正しくインデントします。また、スタックトレースをコードとしてフォーマットして読みやすくします。私はあなたのための書式を修正しました。 –

+2

また、最も重要な部分を除外しました。これは 'sc'が宣言され開かれた方法です。 –

答えて

20

を返すことはありません

ofcourseコードの部分は、入力が適切にフォーマットされているかどうかによって異なります。

12

あなたがnextLine()を呼んでいるとjavadocが説明どおりに、何行がないときには、例外をスローです。それはEOFにnullを返す読者だhasNextLine()

と次の行がある場合、そのループは

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

になり、あなたがチェックする必要がありScannernull

http://download.oracle.com/javase/1,5.0/docs/api/java/util/Scanner.html

2

何らかの理由で、Scannerクラスは読み込めない特殊文字に遭遇した場合にもこの同じ例外を発行します。

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

1

あなたの本当の問題は、あなたが「sc.nextLine()」は、より呼び出しているということです。nextLine()への各呼び出しの前にhasNextLine()方法を使用して超えて、正しいエンコーディングは例えば、Scannerコンストラクタに渡されていることを確認しますNUMBER行。

あなたが唯一10本の入力ラインを持っている場合、あなたは10 TIMES ")sc.nextLine(" のみ呼び出すことができる、知っている必要があります。

"sc.nextLine()"を呼び出すたびに、1つの入力行が消費されます。 "sc.nextLine()"を行数よりも多く呼び出すと、 "java.util.NoSuchElementException:No line found"という例外が発生します。あなたは "sc.nextLine()" "N呼び出す必要がある場合

N" 行 "の時間を、あなたは、少なくともを持っている必要があります"。

は、あなたの問題が解決されます保証を行で「)sc.nextLine(」あなたは呼んで回の数と一致するようにコードを変更しよう、と私。

関連する問題