2013-08-31 2 views
0

У меня есть 2 формы, одна форма для регистрации и другая форма для поиска записей, удаления и т. Д. В регистрационной форме я помещаю данные регистрации в объект, а затем сохраняю его в хэш-карте. Во второй форме я получаю доступ к хэшмапу для удаления, выполняет поиск записей в соответствии с сохраненным идентификатором (ключ).Извлечение записей из 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

Я не понимаю, почему вы дважды создаете 'хранилище'? – varnie

+0

Второй экземпляр находится в другой форме. (Вторая форма) –

+1

это неправильно. если я правильно понял вашу проблему, вы хотите, чтобы ваш объект (карта) был доступен глобально через все ваши формы. Таким образом, должен быть один экземпляр этого. Что касается вашей проблемы: map возвращает 'null', если нет такого элемента с ключом' memberID', который вы пытаетесь стягивать. Вызов 'toString()' on null вызывает это исключение. – varnie

ответ

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); 

Remember-

private static objects are not garbage collected, если только класс держателя не получает GCd. Поэтому нежелательные элементы должны время от времени удаляться вручную с карты.

Смежные вопросы