I have 3 classes: Main, ContactLibrary, and ContactInfo.
ContactLibrary contains an ArrayList called myPhoneBook.
ContactInfo is made up of a bunch of strings containing name, address, etc.
The user wants to search for a name, for example, or anything involving input. The input is done from within the ContactLibrary and ContactInfo classes–both serializable objects.
I get a NPE error when it hits that point, however.
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.
What am I to do?
Here is my Main: http://ideone.com/uvfK4U (Contains the other two classes in the top comments)
Here is a UML diagram: https://i.stack.imgur.com/RG2YO.jpg
The ContactLibrary class, as requested:
/**
* 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);
}
}
You are creating Multiple Scanner objects on the same inputStream, best you create only one and pass it on to the next class in the used methods or the constuctor of the class.
Using multiple scanners on the same stream. Scanners can (and will) consume the stream — this may (will) lead to unexpected side-effects. Best not to do it.
you can replace line 65 in your main class with:
delete the line: (in your class ContactLibrary)