2013-08-31 4 views
0

두 개의 양식, 등록 양식 및 레코드 검색, 삭제 등을위한 다른 양식이 있습니다. 등록 양식에서 등록 정보를 개체에 넣은 다음 해시 맵에 저장합니다. 두 번째 양식에서 나는 해시 맵에 액세스하여 저장된 ID (키)에 따라 레코드를 검색합니다.해시 맵에서 레코드 가져 오기

내 문제는 레코드를 저장하고 두 번째 폼 (해시 맵 액세스)에서 액세스 할 때 null 포인터 예외가 발생합니다.

등록 양식 코드 :

여기
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(); 
     } 

    }           

이지도 클래스입니다

다음

내가 한 일이다 (I 내가 검색 한 키에 저장 한 기록이 경우에도 null 포인터 예외가) (모든 맵이 클래스에) : 여기

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

'storage'를 두 번 인스턴스화하는 이유는 무엇입니까? – varnie

+0

두 번째 인스턴스는 다른 형태입니다. (두 번째 양식) –

+1

잘못되었습니다. 문제를 올바르게 이해했다면 모든 양식을 통해 전 세계에서 개체 (지도)에 액세스 할 수 있기를 바랍니다. 그래서 그것의 단일 인스턴스가 있어야합니다. 문제에 관해서 : map은 문자열을하려고하는 키 'memberID'를 가진 아이템이 없다면'null'을 리턴합니다. null에서 toString()을 호출하면 예외가 발생합니다. – 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); 

기억하기 -

private static objects are not garbage collected (홀더 클래스가 GCd를 얻지 않는 한). 따라서 원하지 않는 항목은지도에서 수시로 수동으로 제거해야합니다.