从散列映射中检索记录

时间:2013-08-31 11:40:52

标签: java forms collections hashmap jframe

我有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());

    }     

这里似乎有什么问题?

感谢您的时间。

1 个答案:

答案 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。因此,应不时地从地图中手动删除不需要的项目。