如何在 Java 中添加并将其存储在数组中之前检查和输入?

Posted

技术标签:

【中文标题】如何在 Java 中添加并将其存储在数组中之前检查和输入?【英文标题】:How to check and Entry before adding and store it in an Array in Java? 【发布时间】:2011-06-30 06:15:32 【问题描述】:

美好的一天..我有一个地址簿程序...它运行正常但它不检查用户输入是否已经存储在数组中..我想做的是...在获得用户之后输入将其与数组中存储的条目进行比较,当它是唯一的时...它将允许用户添加新条目...

这是我在 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++;
    

这是错误: 线程“主”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;
            
        
    

希望你能帮助我......因为我仍然不明白该怎么做。所以我只是展示我的完整代码...感谢您的耐心等待...

【问题讨论】:

您可以使用Set 自动删除重复项。见java.util.Set 【参考方案1】:

在尝试使用 getName() 之前检查以确保您的条目不为空。

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

变成:

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

【讨论】:

@glowcoder.. 我尝试将其替换为我的旧代码...但仍然是相同的输出...它只要求输入名称并自动存在程序...:( @iamanapprentice 除非 AddressBookEntry 的构造函数为 getName() 设置返回状态值,否则 if 语句将始终评估为 false,您将看到的行为是在对话框(因为 if 块后面没有代码)。 一开始为什么要比较?比如,你为什么从你的第一个版本转到你的第二个版本? 另外,当你使用我放在那里的代码时......它会抛出异常并退出吗? @glowcoder 我还在我编辑的帖子中包含了我对您给定代码的实现......对吗?【参考方案2】:

重构以使用 java.util.Map,其中名称是键,AddressBookEntry 是值。然后只需检查 Map.containsKey(SName) 是否。在此之前检查 null 和零长度。

请注意,无论如何,在您当前的设置中,您都希望检查数组中的所有条目,而不仅仅是当前的。那就是索引 i = 0 ... i

【讨论】:

【参考方案3】:

当您调用 AddressBook.addEntry 时,请确保检查您传递的内容是否不为空。要么,要么你试图在一个不存在的位置向数组中添加一些东西。

【讨论】:

【参考方案4】:
entry[counter] = new AddressBookEntry();

您创建一个新的地址簿条目,然后通过 getName 访问该名称,这将为空,因为您的条目是空的(与您用 setName 等填充的数组中的其他条目相反)。

另外:您说过,您想确保每个条目都是独一无二的。为什么你在没有检查之前将一个新条目插入到你的数组中?遍历整个数组并将每个条目的名称与用户输入进行比较。仅当您没有找到任何匹配项时,才继续并添加新条目。

【讨论】:

【参考方案5】:

AddressBookEntry 的构造函数似乎没有实例化 getName() 的值。除非它以某种方式发生,否则entry[counter].getName() 将始终为空。如果该对象始终为 null,则调用 .equals() 将导致您看到 NullPointerException。

建议:

您使用 .equals() 检查什么?如果 AddressBookEntry 的构造函数没有设置值,则此行永远不会为真。如果确实设置了值,请尝试使用空字符串而不是 null。 首先根据光亮编码器的回答执行空值检查。

【讨论】:

【参考方案6】:

通常的做法是创建一个对象的引用,然后将它分配给数组中的位置,所以不要这样做:

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

最好这样做:

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

这样你就可以遍历数组并检测条目是否已经被插入,而不是再次插入。

【讨论】:

以上是关于如何在 Java 中添加并将其存储在数组中之前检查和输入?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取整数的位数并将其存储到数组中? [关闭]

批处理脚本:在最后/第一次出现字符之后/之前提取文本并将其存储在数组中

如何在最后一个索引Swift中添加元素

只进行一次查询并将其存储在数组中还是每次都进行查询更有效?

如何读取文本文件并将其行添加到 Java 中的数组中?

IOS - 目标 C,如何读取核心数据并将其存储到可变数组中