我有2个表格,一个表格用于登记,另一个表格用于搜索记录,删除等。 在注册表单中,我将注册详细信息放入对象中,然后将其存储在哈希映射中。在第二种形式中,我访问要删除的hashmap,根据id保存(Key)搜索记录。
我的问题是当我保存记录并从第二种形式访问它(访问hashmap)时,我得到空指针异常。 (即使我将一条记录保存到搜索到的密钥,我也会得到空指针异常)
这就是我所做的:
注册表格代码:
Maps storage=new Maps();
private void btnRegisterActionPerformed(java.awt.event.ActionEvent evt) {
try{
String firstName=txtFirstName.getText();
String initials=txtInitials.getText();
String birthDay=cmbBirthDay.getSelectedItem().toString();
String birthMonth=cmbBirthMonth.getSelectedItem().toString();
String birthYear=txtBirthYear.getText();
String Gender=cmbGender.getSelectedItem().toString();
String address=txtAddress.getText();
String tele=txtTele.getText();
String membershipType="";
String paymentType="";
String memberid=txtMemberId.getText();
if(rbPlatinum.isSelected());{
membershipType=rbPlatinum.getText();
}
if(rbGold.isSelected());
{
membershipType=rbGold.getText();
}
if(rbSilver.isSelected());
{
membershipType=rbSilver.getText();
}
if(rbAnually.isSelected());{
paymentType=rbAnually.getText();
}
if(rbSemi.isSelected());{
paymentType=rbSemi.getText();
}
if(rbMonthly.isSelected());{
paymentType=rbMonthly.getText();
}
Members newMember=new Members(firstName,initials,birthDay,birthMonth,birthYear,Gender,memberid,address,tele,membershipType,paymentType);
storage.setMemberMap(memberid, newMember);
JOptionPane.showMessageDialog(frame,"Successfully Registered");
}catch(Exception e){
JOptionPane.showMessageDialog(frame,"ERROR!");
e.getStackTrace();
}
}
这是地图类(所有地图都在这个类中):
public class Maps {
public Maps(){}
Map<String,Members> memberMap=new HashMap();
//returns the memberMap
public Map<String, Members> getMemberMap() {
return memberMap;
}
//add items to map
public void setMemberMap(String key,Members object) {
memberMap.put(key,object);
}
}
以下是我在第二种表单中用于搜索记录的代码: -
Maps storage=new Maps();
private void btnSearchMemberActionPerformed(java.awt.event.ActionEvent evt) {
String memberID=txtSearchId.getText();
//get the record and display
txtArea.setText(storage.getMemberMap().get(memberID).toString());
}
这里似乎有什么问题?
感谢您的时间。
答案 0 :(得分:2)
您正在两个表单中创建Maps storage=new Maps();
。 Maps
已
Map<String,Members> memberMap=new HashMap();
作为非静态字段。因此,无论何时创建new Maps()
,都会在内部创建新 memberMap
。
另一种方法是将memberMap作为静态(共享变量)并为它们提供静态访问方法
public class Maps {
private static Map<String,Members> memberMap=new HashMap<>();
public static Map<String, Members> getMemberMap() {
return memberMap;
}
public static void setMemberMap(String key,Members object) {
memberMap.put(key,object);
}
}
通过这种方式,您可以在一个表单中添加项目
Maps.setMemberMap(memberid, newMember);
从其他形式获得相同的值
Maps.getMemberMap().get(memberID);
<强>记住 - 强>
private static objects are not garbage collected,除非持有者类获得GCd。因此,应不时地从地图中手动删除不需要的项目。