You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何二叉树前序遍历无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时:

  1. 进入if块,向sb追加了"null,"
  2. 但if块结束后,程序会硬着头皮执行下面的sb.append(root.val)——这时候root是null,访问它的val成员变量,直接触发了你提到的java.lang.NullPointerException,完全对应“使用变量内容前未判断是否为null”的场景。

而第二个函数用了else分支:

  • 当root == null时,只会执行if块里的内容,不会碰else块里的代码,自然也就不会去访问root.val,完美避开了空指针。

额外小提醒

还有个细节要注意:你的StringBuilder是全局变量,如果多次调用这个函数的话,会导致字符串内容不断累加。如果希望每次调用都生成全新的遍历结果,建议把StringBuilder放在函数内部,或者每次调用前清空它哦~

内容的提问来源于stack exchange,提问作者BlueJapan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 13:42:33