1

Main、ContactLibrary、ContactInfoの3つのクラスがあります。ContactLibraryには、myPhoneBookというArrayListが含まれています。ContactInfoは、名前、住所などを含む一連の文字列で構成されています。

ユーザーは、たとえば名前など、入力に関連するものを検索したいと考えています。入力は、ContactLibraryクラスとContactInfoクラス(どちらもシリアル化可能なオブジェクト)内から行われます。

ただし、そのポイントに達するとNPEエラーが発生します。

You have 3 entry(s) saved to disc.

Hello, and welcome to Team 6's contact list.
What would you like to do?
Enter the corresponding number of choice.

1: Add an entry to the contact list.
2: Print the entire contact list.
3: Search for a contact.
4: Exit the program.

Please enter a number from 1-4.
3
What would you like to search by?
Exception in thread "main" java.lang.NullPointerException
    at ContactLibrary.searchByCriteria(ContactLibrary.java:62)
    at Main.optionsPrompt(Main.java:62)
    at Main.main(Main.java:25)
1: Last Names.
2: Emails.
3: Zip codes.

どうしようかな?

これが私のメインです:http://ideone.com/uvfK4U(上のコメントに他の2つのクラスが含まれています)これがUML図です:http://imgur.com/9W3TS

要求に応じて、ContactLibraryクラス:

/**
 * ContactLibrary, when constructed, creates an ArrayList of ContactLibrary
 * references called myPhoneBook. Every index is made to fill in objects
 * of ContactInfo, which contains entries and credentials.
 * 
 * Contains methods to create a new entry, search and print by criteria, and print list.
 */
import java.util.*;

public class ContactLibrary implements java.io.Serializable {
    private static final long serialVersionUID = 1L;
    private ArrayList<ContactInfo> myPhoneBook;
    private Scanner libraryInput = new Scanner(System.in);

    /** Constructs the ArrayList that will hold references to ContactInfo. */
    public ContactLibrary() {
        myPhoneBook = new ArrayList<ContactInfo>();
    }

    /**
     * Adds an entry to the ArrayList and utilizes the set methods in
     * ContactInfo.
     */
    public void addEntry() {
        int doAgain = 1;
        do {
            myPhoneBook.add(new ContactInfo());
            System.out.println("Would you like to enter another contact?");
            System.out.println("1: Yes.");
            System.out.println("2: No.");
            doAgain = libraryInput.nextInt();
        } while (doAgain == 1);
    }

    /**
     * Goes through every index in myPhoneBook and runs ArrayList.get() on them.
     */
    public void printList() {
        for (int i = 0; i < myPhoneBook.size(); i++) {
            System.out.println(myPhoneBook.get(i));
        }
    }

    /** Counts the number of objects within myPhoneBook and returns a string. */
    public String scanDisc() {
        int entryCount = myPhoneBook.size();
        return "You have " + entryCount + " entry(s) saved to disc.\n";
    }

    /**
     * The prompt for having the user search the database via criteria. Asks the
     * user to enter in their search criteria.
     */
    public void searchByCriteria() {
        String criteria;
        //libraryInput = new Scanner("System.in");
        int subSubMenuChoice = 0;
        System.out.println("What would you like to search by?");
        System.out.println("1: Last Names.");
        System.out.println("2: Emails.");
        System.out.println("3: Zip codes.");
        subSubMenuChoice = libraryInput.nextInt();
        switch (subSubMenuChoice) {
        case 1:
            System.out
                    .println("Please enter the last name you'd like to search for:");
            criteria = libraryInput.next();
            searchByLastName(criteria);
            break;
        case 2:
            System.out
                    .println("Please enter the e-mail you'd like to search for:");
            criteria = libraryInput.next();
            searchByEmail(criteria);
            break;
        case 3:
            System.out
                    .println("Please enter the zip code you'd like to search for:");
            criteria = libraryInput.next();
            searchByZip(criteria);
            break;
        default:
            System.out.println("Exiting");
            break;
        }
    }

    /**
     * Loops through every element in the array and returns a toString of that
     * index for comparing with the search criteria via contains().
     */
    public void searchByEmail(String criteria) {
        for (int i = 0; i < myPhoneBook.size(); i++) {
            if (criteria.compareTo((myPhoneBook.get(i)).getEmail()) == 0) {
                System.out.println(myPhoneBook.get(i));
            } else {
                System.out.print("");
            }
        }
    }

    /**
     * Loops through every element in the array and returns a toString of that
     * index for comparing with the search criteria via contains().
     */
    public void searchByLastName(String criteria) {
        for (int i = 0; i < myPhoneBook.size(); i++) {
            if (criteria.compareTo((myPhoneBook.get(i)).getLastName()) == 0) {
                System.out.println(myPhoneBook.get(i));
            } else {
                System.out.print("");
            }
        }
    }

    /**
     * Loops through every element in the array and returns a toString of that
     * index for comparing with the search criteria via contains().
     */
    public void searchByZip(String criteria) {
        for (int i = 0; i < myPhoneBook.size(); i++) {
            if (criteria.compareTo((myPhoneBook.get(i)).getZipcode()) == 0) {
                System.out.println(myPhoneBook.get(i));
            } else {
                System.out.print("");
            }
        }
    }

    /** Reorganizes the array in order by last name. */
    public void sortData() {
        Collections.sort(myPhoneBook);
    }

}
4

1 に答える 1

0

同じinputStream上に複数のScannerオブジェクトを作成しています。作成するのは、1つだけにして、使用するメソッドまたはクラスの構成要素の次のクラスに渡すのが最適です。

同じストリームで複数のスキャナーを使用する。スキャナーはストリームを消費する可能性があります(そして消費します)。これにより、予期しない副作用が発生する可能性があります。それをしないのが最善です。

メインクラスの65行目を次のように置き換えることができます。

myLibrary.searchByCriteria(menuInput);

次の行を削除します:(クラスContactLibrary内)

private Scanner libraryInput = new Scanner(System.in);
于 2012-11-22T20:02:43.077 に答える