1

do-whileループ内の3行目でクラッシュし、入力を待機しません。

 input = kb.nextInt();

スタックトレース:

スレッド「メイン」の例外java.util.NoSuchElementException

java.util.Scanner.throwFor(不明なソース)で

java.util.Scanner.next(不明なソース)で

java.util.Scanner.nextInt(不明なソース)で

java.util.Scanner.nextInt(不明なソース)で

main.MainDriver.main(MainDriver.java:50)で

関連コード:

do
    {
        displayFullMenu();
        System.out.print("Selection: ");
        input = kb.nextInt();
        
        switch (input)
        {
        //Create new survey
        case 1:     currentSurvey = new Survey();
                    break;
        
        //Display current survey            
        case 2:     currentSurvey.display();
                    break;
        
        //Save current survey           
        case 3:     saveSurvey(currentSurvey);
                    break;
                    
        //Load a survey
        case 4:     currentSurvey = loadSurvey();
                    break;
        
        //Modify a survey
        case 5:     currentSurvey.modify();
                    break;
                    
        /*******************Test Functions*******************/
                    
        //Create new test
        case 6:     currentSurvey = new Test();
                    break;
        
        //Display current test
        case 7:     currentSurvey.display();
                    break;
        
        //Save current test
        case 8:     saveSurvey(currentSurvey);
                    break;
                    
        //Load a test
        case 9:     currentSurvey = loadTest();
                    break;
                    
        //Modify a test
        case 10:    currentSurvey.modify();
                    
        default:    System.out.println("Invalid choice. Please make a valid choice: ");
                    input = kb.nextInt();
                    System.out.println();
        }
    } while (input != 99);
    kb.close();

オプション9を選択するとクラッシュします。ファイルが正しく保存されてから、ループの先頭に戻り、前述の行でクラッシュします。もっと入力を求めてほしい。

何が得られますか?

4

2 に答える 2

3

オプション8を選択すると、でsaveSurvey()、新しいスキャナーを(そのメソッドで)作成する必要があります。これはすべて、メインメソッド内にあるためです。それが問題になるのでしょうか?

はい、それが問題になる可能性があります。それがdとScanner同じソース(System.in?)を持っている場合、それは基になるストリームを閉じ、入力を取得できなくなります。kbclose()kb

于 2012-11-04T22:58:34.920 に答える
1

私はそれを考え出した。

全体の問題は、メインで静的スキャナーを作成しなかったことが原因でした。メイン以外の方法で静的スキャナーが必要になったときに、新しいスキャナーを作成しました。

それ以外の

public class MainDriver
{
    public static Scanner kb = new Scanner(System.in);
    public void main(String[] args) throws IOException 
   {

私が持っていた:

public class MainDriver
{
    public static void main(String[] args) throws IOException 
    {
        public static Scanner kb = new Scanner(System.in);

そして、他の方法で新しいスキャナーを作成しました。これらのメソッドの最後に、スキャナーを閉じました。close()他のメソッド内にあるすべてのステートメントを削除すると、問題が解消されたため、ローカルスキャナーを閉じていたと思います。

于 2012-11-04T23:04:37.913 に答える