0

好的,看起来我的主课遇到了一些问题。它在第二次运行时打破了我的循环并显示和错误。它说我的扫描仪从菜单中读取用户选择会产生错误?那是怎么回事,它在第一个循环中工作,但由于某种原因它不能再次运行。

"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()关闭您的Scanner(扫描System.in),因为两者都在扫描System.in

希望这能解决您的问题。我只是碰巧在 SO 上找到了这个问题。查看此内容以获取更详细的说明。

文档是这样说的:-

public void close() 抛出 IOException

关闭此输入流并释放与此流关联的所有系统资源。close 的一般约定是它关闭输入流。关闭的流不能执行输入操作,也不能重新打开。

于 2013-03-22T15:58:39.940 回答