Как проверить и войти перед добавлением и хранить его в массиве в Java? - PullRequest
3 голосов
/ 19 февраля 2011

добрый день .. у меня есть программа адресной книги ... она работает правильно, но она не проверяет, был ли пользовательский ввод уже сохранен в массиве ... хочу, чтобы я хотел это ... после получения пользователя входные данные сравнивают его с сохраненной записью в массиве, и когда он является уникальным ... он позволит пользователю добавить новую запись ...

вот мой старый код в addEntry ():

public void addEntry () {

entry[counter] = new AddressBookEntry();
entry[counter].setName(JOptionPane.showInputDialog("Enter name: "));
entry[counter].setAdd(JOptionPane.showInputDialog("Enter add: "));
entry[counter].setPhoneNo(JOptionPane.showInputDialog("Enter Phone No.: "));
entry[counter].setEmail(JOptionPane.showInputDialog("Enter E-mail: "));
counter++;

}

и вот что я планирую сделать, но это ОШИБКА:

public void addEntry () {

    entry[counter] = new AddressBookEntry();
    SName = JOptionPane.showInputDialog("Enter name: ");//<-- asks user for the name
    if (!entry[counter].getName().equals(SName)) {//<--compare
        entry[counter].setName(JOptionPane.showInputDialog("Enter name: "));
        entry[counter].setAdd(JOptionPane.showInputDialog("Enter add: "));
        entry[counter].setPhoneNo(JOptionPane.showInputDialog("Enter Phone No.: "));
        entry[counter].setEmail(JOptionPane.showInputDialog("Enter E-mail: "));
        counter++;
    }
}

Это ошибка: Исключение в потоке "main" java.lang.NullPointerException в AddressBook.addEntry (AddressBook.java:57) в AddressBook.main (AddressBook.java:28) Java Результат: 1 СТРОИТЬ УСПЕШНО (общее время: 4 секунды)

вывод только попросить пользователя ввести имя и затем автоматически выйти ... это может быть логической ошибкой ... но я не знаю, какое возможное решение

Нужна помощь, пожалуйста, спасибо

вот мой полный код:

import javax.swing.JOptionPane;
import javax.swing.JTextArea;

public class AddressBook {

    private AddressBookEntry entry[];
    private int counter;
    private String SName;
    private int notfound = 0;

    public static void main(String[] args) {
        AddressBook a = new AddressBook();
        a.entry = new AddressBookEntry[100];
        int option = 0;
        try {
            while (option != 5) {
                String content = "Choose an Option\n\n"
                        + "[1] Add an Entry\n"
                        + "[2] Delete an Entry\n"
                        + "[3] Update an Entry\n"
                        + "[4] View all Entries\n"
                        + "[5] View Specific Entry\n"
                        + "[6] Exit";
                option = Integer.parseInt(JOptionPane.showInputDialog(content));
                switch (option) {
                    case 1:
                        a.addEntry();
                        break;
                    case 2:
                        a.deleteEntry();
                        break;
                    case 3:
                        a.editEntry();
                        break;
                    case 4:
                        a.viewAll();
                        break;
                    case 5:
                        a.searchEntry();
                        break;
                    case 6:
                        System.exit(1);
                        break;
                    default:
                        JOptionPane.showMessageDialog(null, "Invalid Choice!");
                }
            }
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(null, "Please Choose a Number in the displayed Menu");
        }
    }

    public void addEntry() {
        entry[counter] = new AddressBookEntry();
        SName = JOptionPane.showInputDialog("Enter name: ");
        if (entry[counter] == null &&  entry[counter].getName() == null
                && !entry[counter].getName().equals(SName)) {
            entry[counter].setName(JOptionPane.showInputDialog("Enter name: "));
            entry[counter].setAdd(JOptionPane.showInputDialog("Enter add: "));
            entry[counter].setPhoneNo(JOptionPane.showInputDialog("Enter Phone No.: "));
            entry[counter].setEmail(JOptionPane.showInputDialog("Enter E-mail: "));
            counter++;
        }
    }
    /*public void addEntry() {
    entry[counter] = new AddressBookEntry();
    entry[counter].setName(JOptionPane.showInputDialog("Enter name: "));
    entry[counter].setAdd(JOptionPane.showInputDialog("Enter add: "));
    entry[counter].setPhoneNo(JOptionPane.showInputDialog("Enter Phone No.: "));
    entry[counter].setEmail(JOptionPane.showInputDialog("Enter E-mail: "));
    counter++;
    }*/

    public void viewAll() {
        String addText = "  NAME\tADDRESS\tPHONE NO.\tE-MAIL ADD\n\n";
        int nonNull = 0;
        for (int i = 0; i < entry.length; i++) {
            if (entry[i] != null) {
                addText = addText + entry[i].getInfo() + "\n";
                nonNull++;
            }
            if (nonNull == counter) {
                break;
            }
        }
        JOptionPane.showMessageDialog(null, new JTextArea(addText));
    }

    public void searchEntry() {
        SName = JOptionPane.showInputDialog("Enter Name to find: ");
        searchMethod();
    }

    public void searchMethod() {
        for (int i = 0; i < counter; i++) {
            if (entry[i].getName().equals(SName)) {
                JOptionPane.showMessageDialog(null, entry[i].getInfo2());
                notfound = 0;
                break;
            } else {
                notfound++;
            }
        }
        if (notfound != 0) {
            JOptionPane.showMessageDialog(null, "Name Not Found!");
        }
    }

    public void editEntry() {
        SName = JOptionPane.showInputDialog("Enter Name to edit: ");
        for (int i = 0; i < counter; i++) {
            if (entry[i].getName().equals(SName)) {
                entry[i] = new AddressBookEntry();
                entry[i].setName(JOptionPane.showInputDialog("Enter new name: "));
                entry[i].setAdd(JOptionPane.showInputDialog("Enter new add: "));
                entry[i].setPhoneNo(JOptionPane.showInputDialog("Enter new Phone No.: "));
                entry[i].setEmail(JOptionPane.showInputDialog("Enter new E-mail: "));
                notfound = 0;
                break;
            } else {
                notfound++;
            }
        }
        if (notfound != 0) {
            JOptionPane.showMessageDialog(null, "Name Not Found!");
        }
    }

    public void deleteEntry() {
        SName = JOptionPane.showInputDialog("Enter Name to delete: ");
        if (SName == null) {
            return;
        }
        for (int i = 0; i < counter; i++) {
            if (entry[i] != null && SName.equals(entry[i].getName())) {
                entry[i] = null;
                JOptionPane.showMessageDialog(null, "Found!");
                break;
            }
        }
    }
}

надеюсь, вы сможете мне помочь ... потому что я до сих пор не понимаю, что делать. Так что я просто показываю свой полный код ... спасибо за ваше терпение, ребята ...

Ответы [ 6 ]

2 голосов
/ 19 февраля 2011

Убедитесь, что ваша запись не является нулевой, прежде чем пытаться сделать getName() из нее.

if (!entry[counter].getName().equals(SName))

превращается в:

if  (entry[counter] != null 
 &&  entry[counter].getName() != null 
 && !entry[counter].getName().equals(SName))
0 голосов
/ 19 февраля 2011

Обычная практика - создать ссылку на объект, а затем присвоить его позиции в массиве, поэтому вместо этого:

entry[counter] = new AddressBookEntry();
entry[counter].setXxx();
...

Предпочтительно сделать:

AddressBookEntry newEntry = new AddressBookEntry();
newEntry.setXxx();
...
entry[counter] = newEntry;

Таким образом, вы можете выполнить итерацию по массиву и определить, была ли запись уже вставлена, и не вставлять ее снова.

0 голосов
/ 19 февраля 2011

Кажется, что конструктор для AddressBookEntry не создает значение для getName ().Если это не так, то entry[counter].getName() всегда будет нулевым.Если этот объект всегда равен нулю, то вызов .equals() приведет к появлению исключительной ситуации NullPointerException.

Предложения:

  • Что вы проверяете с помощью .equals ()?Если конструктор для AddressBookEntry не устанавливает значение, эта строка никогда не может быть истинной.Если он устанавливает значение, попробуйте использовать пустую строку вместо нуля.
  • Сначала выполняйте проверку на ноль для каждого ответа свечения.
0 голосов
/ 19 февраля 2011
entry[counter] = new AddressBookEntry();

Вы создаете новую запись адресной книги, а затем получаете доступ к имени через getName, которое будет иметь значение null, поскольку ваша запись пуста (в отличие от других записей в вашем массиве, которые вы заполнили setName и т. Д.).

Плюс: Вы сказали, что хотите убедиться, что каждая запись уникальна. Почему тогда вы вставляете новую запись в ваш массив без проверки раньше? Переберите весь массив и сравните имя каждой записи с пользовательским вводом. Только если вы не нашли совпадений, продолжите и добавьте новую запись.

0 голосов
/ 19 февраля 2011

Когда вы звоните AddressBook.addEntry, убедитесь, что вы проверяете, не является ли то, что вы передаете, не нулевым. Либо это, либо вы пытаетесь добавить что-то в массив в позиции, которая не существует.

0 голосов
/ 19 февраля 2011

Рефакторинг для использования java.util.Map, где имя является ключом, а AddressBookEntry является значением. Затем просто проверьте, есть ли Map.containsKey (SName). И перед этим проверьте нулевую и нулевую длину.

Обратите внимание, что независимо от того, в текущих настройках вы захотите проверить ВСЕ записи в вашем массиве, а не только текущие. То есть индексы i = 0 ... i

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...