2016-03-09 51 views
-1

我一個邪惡的劊子手計劃出於某種原因,我得到這個工作的錯誤:邪惡的劊子手Java程序

What length word do you want to use? 4 
How many wrong answers allowed? 4 

guesses : 4 
guessed : [] 
current : ---- 
Your guess? e 
Exception in thread "main" java.lang.NullPointerException 
    at Game.HangmanManager.record(HangmanManager.java:142) 
    at Game.HangmanMain.playGame(HangmanMain.java:62) 
    at Game.HangmanMain.main(HangmanMain.java:42) 

這裏是我的程序:

package Game; 

import java.util.*; 

public class HangmanManager 
{ 

    private String pattern; 
    private int max; 
    private int length; 
    private SortedSet<Character> guessesMade; 
    private Set<String> currentWords; 
    private Map<String, Set<String>> patternMap; 

    public HangmanManager(List<String> dictionary , int length, int max) 
    { 
     this.max = max; 
     this.length = length; 


     if(length < 1 && max < 0) 
      { 
       throw new IllegalArgumentException(); 

      } 

     words = new TreeSet<String>(); 
     guessesMade = new TreeSet<Character>(); 
     currentWords = new TreeSet<String>(); // current words =(words) 
     patternMap = new TreeMap<String, Set<String>>(); // patternMAP = < pattern, words> 

     for (String word : dictionary) 
     { 
      if (word.length() == length) 
      { 
      words.add(word); // if length of the word matches a word with the same length it will be added 
      } 

     } 

    } 


    public Set<String> words() 
    { 
     return words; 
    } 


    public int guessesLeft() 
    { 
     return max - guessesMade.size(); 
    } 



    public SortedSet<Character> guesses() 
    { 
     return guessesMade; 
    } 


    public String pattern() 
    { 
     if (words.isEmpty()) 
     { 
      throw new IllegalArgumentException("Invalid No Words"); 
     } 
     pattern = " "; // blank for now 
     for (int i = 0; i < length; i++) 
     { 
      pattern += "-"; // will have a "-" for how long the length of the word is 
     } 

     return pattern; // will return the number of lines 
    } 


    public int record(char guess) 
    { 
      if (guessesLeft() < 1 || words.isEmpty()) 
      { 
       throw new IllegalStateException(); 
      } 

      if (!words.isEmpty() && guessesMade.contains(guess)) 
      { 
       throw new IllegalArgumentException(); 
      } 

      guessesMade.add(guess); // guess 
      int occurences = 0; 

      for(String word: words) 
      {   
       if(patternMap.containsKey (pattern)) 
       { 

        occurences = generatePattern(word, guess); // the word including the guess letter will fill in the blank spots 
        currentWords.add(word); // the word will be added to the possibilities 
        currentWords = patternMap.get(pattern); // the word will be able to fill once the guesses are made 
//     if(patternMap.get(pattern)!=null) 
//      { 
//       currentWords = patternMap.get(pattern); 
//       
//      } 
        patternMap.put(pattern, currentWords); 
       } 
       else 
       { 
       currentWords.add(word); 
       patternMap.put(pattern, currentWords); 
       } 
      } 

     words = find(); 
     return occurences; 
    } 


    private Set<String> find() 
    { 
     int maxSize = 0; 

     Map <String, Integer> patternCount = new TreeMap<String, Integer>(); 

     for (String key : patternMap.keySet()) // keyset equals word 
     { 
      patternCount.put(key, patternMap.get(key).size()); // size of the word 

       if (patternMap.get(key).size() > maxSize) 
       { 
        maxSize = patternMap.get(key).size(); 
        pattern = key; // pattern will becomes based on the word 
       } else if (patternMap.get(key).size() == maxSize) 
       { 
        if (key.length() >= pattern.length()) 
        { 
         pattern = key; 
         maxSize = patternMap.get(key).size(); // the pattern is now the word key 
        } 
       } 
      } 
     System.out.println("Current pattern: " + pattern); 

     return patternMap.get(pattern); // the pattern that will becomes now that the word was picked 
    } 

    private int generatePattern(String s, char guess) 
    { 
     int count = 0; 
     pattern = ""; 
      for (int i = 0; i < length; i++) 
      { 
       if (s.charAt(i) == guess) 
       { 
        pattern += guess + " "; 
        count++; 
       } else 
       { 
        pattern += "- "; 
       } 
      } 
     return count; 
    } 

} 

錯誤似乎發生在爲記錄方法:

patternMap.put(pattern, currentWords); 149線

我跑了調試器很多次,我注意到如果你遵循這個程序,你會發現currentWords在程序運行一遍之後最終會變成Null,儘管我實例化了它,並且我爲patternMap創建了一個Map。

如果誰能告訴我做什麼或改變什麼,我將非常感激,因爲我所以用這個

+3

你的代碼是不完整的,並且將無法編譯,這意味着您的問題或者將要關閉爲[重複什麼是空指針異常,以及如何解決它?](http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and-how-do-i-fix-it)或「爲什麼我的代碼不工作 - 沒有提供可運行的示例「 – MadProgrammer

+0

我可以提供HangmanMain程序和字典文本文件 – Jay

回答

0

patternMap丟失是一個TreeMap。正如你所說,你的問題是與patternMap.put(pattern, currentWords);線149.按照JavaDoc中TreeMapput()拋出NullPointerException ...

if the specified key is null and this map uses natural ordering, or its comparator does not permit null keys

由於TreeMap<String,Object>使用自然順序的它的鍵(即String),問題是那patternnull。你爲什麼不只是初始化pattern爲缺省值:

private String pattern = " "; 
+0

以及我注意到當前的字符爲空而不是模式 – Jay

+0

'patternMap.put(pattern,null);'完全有效,只要'pattern!= null'。 –

+0

好吧我修好了我相信但現在我有一個新問題 – Jay