2012-11-05 107 views
-1

我有一個霍夫曼樹和一個角色,我想要返回霍夫曼樹內應該是那個角色的編碼。誰能告訴我爲什麼我的代碼產生錯誤?

我已經實現了它使用廣度優先遍歷方法,每次我檢查左右樹,我檢查樹的數據是否等於我正在尋找的字符。但是,每次我向右或向左移動時,都會在編碼中添加0或1。最終,當我找到與樹的數據相同的字符時,我會返回該樹的編碼值。

代碼:

public static String findCharEncoding(BinaryTree<CharProfile> bTree, char character) { 
     Queue<BinaryTree<CharProfile>> treeQueue = new LinkedList<BinaryTree<CharProfile>>(); 

     // Create a TreeWithEncoding object from the given arguments and add it to the queue 
     treeQueue.add(bTree); 

     while (!treeQueue.isEmpty()) { 
      BinaryTree<CharProfile> t = treeQueue.remove(); 

->   if (t.getLeft().getData().getCharacter() == character) { 
       return t.getLeft().getData().getEncoding(); 
      } 
      if (t.getLeft() != null) { 
       t.getLeft().getData().setEncoding(t.getLeft().getData().getEncoding() + "0"); 
       treeQueue.add(t.getLeft()); 
      } 

      if (t.getRight().getData().getCharacter() == character) { 
       return t.getRight().getData().getEncoding(); 
      } 
      if (t.getRight() != null) { 
       t.getRight().getData().setEncoding(t.getRight().getData().getEncoding() + "1"); 
       treeQueue.add(t.getRight()); 
      } 
     } 

     // If it gets to here, the while loop was unsuccessful in finding the encoding 
     System.out.println("Unable to find."); 
     return "-1"; 
    } 

我已經實現如下:

 for (int i = 0; i < charOccurrences.size(); i++) { 
      char character = charOccurrences.get(i).getCharacter(); 

      charOccurrences.get(i).setEncoding(findCharEncoding(huffmanTree, character)); 
      System.out.println(charOccurrences.get(i).getEncoding()); 
     } 

CharProfile是保存字符值,字符和編碼的概率自定義類。

它在我用箭頭指示的行if (t.getLeft().getData().getCharacter() == character) {處不斷返回一個NullPointerExceptionError。我已經嘗試過,但我似乎無法弄清楚爲什麼。

+0

也許你的't.getData()'爲空。你已經檢查了'2 if's',剩下的'two if's''bare'。你也應該把它們放在'if(t.getData()!= null)'的檢查中。 –

回答

1

要麼tnullt.getLeft()返回nullt.getLeft().getData()返回null。 由於我們只看到您展示的代碼,因此您需要調試該代碼。

你可以插入錯誤的一行上面:

if (t == null) { 
    System.out.println("t = null"); 
} else if (t.getLeft() == null) { 
    System.out.println("t.getLeft() returns null"); 
} else if (t.getLeft().getData() == null) { 
    System.out.println("t.getLeft().getData() returns null"); 
} 
+0

't'不能爲空,因爲檢查僅在'while'中執行。 –

+0

t.getLeft()。getData()(爲空,但我不能放置原因。 –

+0

我們沒有看到代碼的相關部分,以確定爲什麼此方法返回'null'。 – jlordo

0

正如在評論中指出,要覈實是否t.getLeft()回報null在一個點而不是別人。另外,個人而言,我只是討厭一直調用相同get方法的代碼。我可能會採取本節:

 if (t.getLeft().getData().getCharacter() == character) { 
      return t.getLeft().getData().getEncoding(); 
     } 
     if (t.getLeft() != null) { 
      t.getLeft().getData().setEncoding(t.getLeft().getData().getEncoding() + "0"); 
      treeQueue.add(t.getLeft()); 
     } 

,並把它改寫爲:

left = t.getLeft(); 
if (left != null) { 
    data = t.getData(); 
    encoding = data.getEncoding(); 
    if (data.getCharacter() == character) { 
    return encoding; 
    else { 
    data.setEncoding(encoding + "0"); 
    treeQueue.add(left) 
    } 
} 

(我省略了類型聲明,因爲我已經添加了變數,因爲我不知道的。正確的類型名稱)

這應該避免NullPointerException如果t.getLeft()是什麼返回null;否則,至少應該看到哪個引用是null,因爲在一行中不會有多個解除引用時,會發生異常。右側的部分可以用同樣的方法重寫(實際上,您可以使一種方法只傳遞左值和右值,因爲您對兩者都做同樣的事情)。

+0

t.getLeft ).getData()是什麼返回錯誤。 –

相關問題