为何二叉树前序遍历无else分支会抛出java.lang.NullPointerException?
为什么第一个前序遍历函数会抛出NullPointerException?
嗨,作为编程新手遇到这种问题太正常啦,咱们一步步拆解看看~
首先先把两个函数的代码贴出来方便对比:
第一个抛出异常的函数
StringBuilder sb = new StringBuilder(); private String preorder(TreeNode root) { if(root == null){ sb.append("null,"); } sb.append(root.val); sb.append(","); String l = preorder(root.left); String r = preorder(root.right); return sb.toString(); }
第二个正常运行的函数
StringBuilder sb = new StringBuilder(); private String preorder(TreeNode root) { if(root == null){ sb.append("null,"); } else{ sb.append(root.val); sb.append(","); String l = preorder(root.left); String r = preorder(root.right); } return sb.toString(); }
核心问题:if分支后的代码执行逻辑
你已经get到了最关键的点:不管if条件是否成立,只要没有else包裹后续代码,if块执行完后都会继续往下走。
在第一个函数里,当root == null时:
- 进入
if块,向sb追加了"null," - 但
if块结束后,程序会硬着头皮执行下面的sb.append(root.val)——这时候root是null,访问它的val成员变量,直接触发了你提到的java.lang.NullPointerException,完全对应“使用变量内容前未判断是否为null”的场景。
而第二个函数用了else分支:
- 当
root == null时,只会执行if块里的内容,不会碰else块里的代码,自然也就不会去访问root.val,完美避开了空指针。
额外小提醒
还有个细节要注意:你的StringBuilder是全局变量,如果多次调用这个函数的话,会导致字符串内容不断累加。如果希望每次调用都生成全新的遍历结果,建议把StringBuilder放在函数内部,或者每次调用前清空它哦~
内容的提问来源于stack exchange,提问作者BlueJapan
相关产品推荐
相关产品推荐

