2017-04-18 1 views
0

스스로 자바를 배우는 데 도움이되도록 작성하고 각 게임에 베팅하는 데 사용하는 잔액을 유지할 수있는 계정이 포함 된 JForm GUI를 사용하여 블랙 잭 프로그램을 만듭니다. 메인 클래스 인 BlackJackApp.JForm 클래스가 있습니다. 계정은 .txt 파일에 저장되며 readFile 및 writeFile 메소드가 포함 된 Account 클래스를 사용하여 읽습니다. 가 (내 해시 맵은 null 값만 넣고 있습니다.

홍길동 >> 1000000

잭 블랙 >> 1

밥 돌 >> 987654321

: 나는이 값 Accounts.txt라는 이름의 샘플 txt 파일을 생성 실제 txt 파일의 줄 사이에 공백 없음)

텍스트 파일을 읽고이 값을 HashMap에 첨부하는 방법이 있습니다. 이것은 내가 가지고있는 코드입니다. 단지 상부는 참조

public class BlackjackApp extends javax.swing.JFrame { 

Account a = new Account(); 
String account; 
Integer accountBalance; 
HashMap accountsMap = a.getAccountsMap(); 


public void fillAccountNameBox() 
{ 

    for (int i = 0; i < accountsMap.size(); i++) 
    { 
     accountNameBox.addItem((String) accountsMap.get(i)); 
    } 


} 

public BlackjackApp() { 
    initComponents(); 
    a.readFile(); 
    fillAccountNameBox(); //fills comboBox component w/ list of hashMap keys 
    System.out.println(accountsMap.keySet()); 
    for(int i = 0; i < accountsMap.size(); i++) 
     System.out.println(accountsMap.get(i)); 

} 

에서 System.out.println 코드 디버깅이기 포함하여

public void readFile() 
{ 
    accountsMap.clear(); 
    BufferedReader br; 

    try 
    {  
    br = new BufferedReader(new FileReader("Accounts.txt")); 
    String nextLine = br.readLine(); 

     while(nextLine != null) 
     { 
      String lineString[] = nextLine.split(">>"); 
      Integer accountBalance = Integer.parseInt(lineString[1]); 
      System.out.println(lineString[0] + " " + lineString[1] + " " + 
      accountBalance); 
      accountsMap.put(lineString[0], accountBalance); 
      nextLine = br.readLine(); 
     } 
     br.close(); 
    } 
    catch(IOException frex) 
    {System.out.println("An error has occurred while reading the file");} 
} 

이는 내가 JForm 클래스가 해당 코드이다. 이 출력은 다음과 같습니다.

John Doe 1000000 1000000 
Jack Black 1 1 
Bob Dole 987654321 987654321 
[Bob Dole, John Doe, Jack Black] 
null 
null 
null 

내 질문은 이것입니다. 내 해시 맵이 올바른 키를 넣고 값이 null 인 이유는 무엇입니까? lineString 배열이 올바르게 채워지는 경우 Integer accountBalance도 마찬가지지만 실제로 키/값 쌍을 hashmap에 넣는 경우 accountBalance가 null이 아니더라도 키만 넣고 값은 null로 남겨 둡니다. 왜 이런거야? 이 문제와 관련된 조언을 위해 수많은 스레드 검색을 시도했지만 그 조언이 하나도 없습니다. 간과 할 수있는 뭔가가 있어야하지만 초보자로서 문제가있는 곳을 인식하는 것이 어렵습니다.

답변

2

문제는 정보를 인쇄하는 방식에 달려 있습니다. Map.get 메소드는 원하는 값을 가진 키가있는 매개 변수를 전달할 것으로 예상합니다. for 루프에서 키 0, 1 및 2에 첨부 된 값을 요청합니다. 따라서 null 값입니다. 여기에 코드를 변경 :

for(String key : accountsMap.keySet()) 
    System.out.println(accountsMap.get(key)); 

을 당신이 볼 수 있듯이, 나는 또한에 대한-각각을 사용하는 루프 구조를 변경했습니다.

희망이 도움이됩니다.

+0

내가 마침내 내가 어디로 잘못되었는지 이해합니다. 정말 고마워요! 또한 fillAccountBox() 메서드에서 코드를 변경하여 상자가 hashmap의 키 ArrayList로 채워지도록했습니다. – Matthew

+0

오신 것을 환영합니다. 기꺼이 도와 드리겠습니다.그건 그렇고, 단지 두 가지 더 : 1) Map 인터페이스에는 [값] (http://docs.oracle.com/javase/8/docs/api/java/util/Map.html#values)도 있습니다. -) 메서드를 사용하여 fillAccountNameBox 메서드와 같이 키가 필요하지 않은 경우 값 컬렉션을 가져올 수 있습니다. 2) 제네릭에 유형을 추가하는 것이 좋습니다. * HashMap * 그들을 남겨 두지 않고 대신 _HashMap_ –

2

귀하의지도에 귀하가 원하는 것을 정확히 포함하고 있습니다. 문제는 어떻게 액세스하고 있는지입니다. 당신이 지적한 것처럼 다음과 같이

는지도에서 키는 다음과 같습니다 최종 for 루프에서

[Bob Dole, John Doe, Jack Black] 

, 당신은 키 0, 12에 매핑 된 값에 액세스하기 위해 찾고 있습니다. 지도에 이러한 키가 없으므로 null이 표시됩니다.

관련 문제