2017-07-18 3 views
-1
import java.util.Scanner; 

public class Foo { 
    public static void main(String[] args) { 
     Foo foo = new Foo(); 
     foo.getNextToken(); 
     foo.getNextToken(); 
    } 

    public void getNextToken() { 
     Scanner s = new Scanner(System.in); 
     while (true) { 
      if (s.hasNext()) { 
       System.out.println(s.nextLine()); 
       //s.close(); 
       return; 
      } 
     } 
    } 
} 

私は上記のコードを実行しようとすると、期待どおりに動作します。 行を挿入するたびに、コンピュータは次の行をペーストします。スキャナを閉じると新しいスキャナが破損するように見えるのはなぜですか?

enter image description here

私はS。CLOSE()の行をコメント解除して、再度実行した場合しかし、私は、次の動作を取得:何らかの理由で、のhasNext(のために

enter image description here

)メソッドは、次の引数が明らかに存在するにもかかわらず、falseを返します。私はたくさんのことを試みましたが、私は回避策を見つけることができません。私が変更した場合、たとえば、コードは、ちょうど

public void getNextToken() { 
     Scanner s = new Scanner(System.in); 
     System.out.println(s.nextLine()); 
     s.close(); 
     return; 
    } 

その後、再び、それは第一文のために働くために、しかし、その後すぐにはNoSuchElementExceptionができます。 もちろん、第1のスキャナを閉じなければ正常に動作します。

1つのスキャナを閉じると他のスキャナに影響が出るのはわかりませんが、スキャナを閉じないと悪い習慣であると聞いていますが、もっと重要なのは黄色のエラーメッセージです。誰も私にこの問題を解決する方法を教えてもらえますか?それはなぜ起こりますか?私は主な方法でスキャナに引数として渡すこともできますが、それを閉じることもできますが、ちょっと面倒です。

+2

「System.in」を閉じたためです。それをしないでください。スキャナを閉じないでください。新しいものも作成しないでください。同じものを使い続けてください。それでも動作します。同じ基本入力上に複数のスキャナを使用することは実際には悪いことです。データが失われます。 – EJP

+0

ありがとう、それを答えとして追加できますか? –

+0

while(true)ループの目的は何ですか? s.nextLine()は、入力の待機をブロックする必要があります。 – tradeJmark

答えて

3

System.inを閉じたためです。それをしないでください。スキャナを閉じないでください。新しいものも作成しないでください。同じものを使い続けてください。それでも動作します。

実際に同じ基本入力で複数のスキャナを使用すると、になります。データが失われます。

関連する問題