2017-06-13 78 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

相关问题