0

わかりました。メインクラスでいくつか問題が発生したようです。2回目の実行でループが中断され、エラーが表示されます。メニューからユーザー選択を読み取るスキャナーがエラーを作成していると表示されますか?それはどうですか、それは最初のループで動作しましたが、何らかの理由でそれを再び実行することはできません。

"action = new Scanner(System.in).nextInt();" 

エラーを生成しています。ユーザーがメニューオプションを選択しているときにユーザーが入力した整数を読み取ることが非常に重要であるため、これが発生している理由を誰かが知っていますか。

import java.util.Scanner; 
import java.io.FileWriter; 
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.String; 
import java.lang.System;  

public class MainActions {

    public static void main(String args[]) throws IOException {

        int action = 0;

        while (action != 6) {

            Contact.menu();

            new Scanner(System.in);

            action = new Scanner(System.in).nextInt();

            if (action <= 0 || action > 6) {
                System.out.println("Invalid selection. ");
            }

            switch (action) {
            case 1:
                MainActions.addContactInfo();
                break;

            case 2:
                break;

            case 3:
                break;

            case 4:
                break;

            case 5:
                break;
            }
        }
    }

    public static void addContactInfo() {

        Contact contact;
        contact = new Contact();

        Scanner reader = new Scanner(System.in);
        System.out.println("Enter Contact Last Name:");
        String lastname = reader.nextLine();
        contact.setLastName(lastname);
        System.out.println("Enter Contact First Name: ");
        contact.setFirstName(reader.nextLine());
        System.out.println("Enter Contact Street Address: ");
        contact.setHouseAddress(reader.nextLine());
        System.out.println("Enter Contact City: ");
        contact.setCity(reader.nextLine());
        System.out.println("Enter Contact Zip Code: ");
        contact.setZip(reader.nextLine());
        System.out.println("Enter Contact Email: ");
        contact.setEmail(reader.nextLine());
        System.out.println("Enter Contact Phone Number: ");
        contact.setPhone(reader.nextLine());
        System.out.println("Enter Contact Notes: ");
        contact.setNotes(reader.nextLine());

        if (lastname.trim().equals("")) {
            System.out.println("\nLast name was blank, contact not saved.");
            System.exit(0);
        } else {
            ContactList list;
            list = new ContactList();
            list.add(contact);
            list.save();
            Contact c = contact;
            try (PrintWriter output = new PrintWriter(new FileWriter("contactlist.csv", true))) {
                output.printf("%s\r\n", c);
            } catch (Exception e) {}
        }
        reader.close();
    }
}

コンソール:

1. Enter a new person
2. Print the contact list
3. Retrieve a person's information by last name
4. Retrieve a person's information by email address
5. Retrieve all people who live in a given zip code
6. Exit
1
Enter Contact Last Name:
asdf
Enter Contact First Name: 
asdf
Enter Contact Street Address: 
asdf
Enter Contact City: 
asdf
Enter Contact Zip Code: 
asdf
Enter Contact Email: 
asdf
Enter Contact Phone Number: 
asdf
Enter Contact Notes: 
asdf

Contact information has been saved.

Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at MainActions.main(MainActions.java:33)
1. Enter a new person
2. Print the contact list
3. Retrieve a person's information by last name
4. Retrieve a person's information by email address
5. Retrieve all people who live in a given zip code
6. Exit
4

2 に答える 2

2

交換

new Scanner(System.in);

action = new Scanner(System.in).nextInt();

Scanner scan = new Scanner(System.in);

action = scan.nextInt();
于 2013-03-22T15:41:07.580 に答える
1
new Scanner(System.in); // Remove this. Not needed.
action = new Scanner(System.in).nextInt();

待ってください、これは問題ではありません。これが実際の問題です。

reader.close();

あなたのこの行がaddContactInfo()犯人です。これを削除すると、コードが機能します。

これにより、両方がスキャンしているため、メソッド内の(スキャン中の)reader.close()が閉じられます。ScannerSystem.inSystem.in

これで問題が解決することを願っています。私はたまたまSOでこの質問を見つけました。より詳細な説明については、これをチェックしてください。

ドキュメントはこれを言います:-

public void close()はIOExceptionをスローします

この入力ストリームを閉じ、このストリームに関連付けられているシステムリソースを解放します。closeの一般的な契約は、入力ストリームを閉じることです。閉じたストリームは入力操作を実行できず、再度開くこともできません。

于 2013-03-22T15:58:39.940 に答える