2017-06-13 68 views
0

我完成this本文給出了問題,這個答案爲什麼我不能傳遞一個空節點,但我可以通過一個空值

public TreeNode mergeTrees(TreeNode t1, TreeNode t2) { 
     // if both are null, assign merge tree to null 
     if (t1 == null && t2 == null) return null; 
     // if t1 or t2 is null, add 0 
     int sum = (t1 == null ? 0 : t1.val) + (t2 == null ? 0 : t2.val); 
     TreeNode tSum = new TreeNode(sum); // declare locally to prevent overwriting 
     tSum.right = mergeTrees(t1.right, t2.right); 
     tSum.left = mergeTrees(t1.left, t2.left); 
     return tSum; 
    } 

,它拋出一個NullPointerException異常時,T1或T2等於空。但是,當我查找正確的答案時,它只是稍有不同。

public TreeNode mergeTrees(TreeNode t1, TreeNode t2) { 
     // if both are null, assign merge tree to null 
     if (t1 == null && t2 == null) return null; 
     // if t1 or t2 is null, add 0 
     int sum = (t1 == null ? 0 : t1.val) + (t2 == null ? 0 : t2.val); 
     TreeNode tSum = new TreeNode(sum); // declare locally to prevent overwriting 
     // pass null if either == null to avoid nullpointerexception 
     tSum.right = mergeTrees(t1 == null ? null : t1.right, t2 == null ? null : t2.right); 
     tSum.left = mergeTrees(t1 == null ? null : t1.left, t2 == null ? null : t2.left); 
     return tSum; 
    } 

其中不是傳遞左或右節點值,而是傳遞null。

爲什麼java只在第一種情況下拋出一個空指針異常,當兩個參數看起來都等於空?

+1

這兩個版本的邏輯將允許至少一個傳入的'TreeNode'爲'null'。然後,在進行遞歸調用時,可能會引用'null'對象。第二個版本通過檢查這個來涵蓋它的基礎。 –

+0

它比「稍微」不同。在解引用它之前,正確的版本檢查每個引用變量的'null'。這是非常不同的,不是輕微的。這是「Aah」和「Aaaagh!」之間的區別巨大差距。 –

回答

0

您正在對空對象(t1或t2)調用.right方法。在空對象上調用方法將導致空異常。

標題不正確 - 您未傳遞空節點,而是傳遞空節點的子節點。

+0

感謝您的澄清。這有助於很多! – Ryan

相關問題