如何在 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 中添加并将其存储在数组中之前检查和输入?的主要内容,如果未能解决你的问题,请参考以下文章