为什么没有'else',在preoder遍历BT树时就会抛出java.lang.NullPointerException?

问题描述 投票:-1回答:1

我是编程新手。我的问题可能很笨。(***如果对别人没有价值,我以后会删除这个问题)请看这里的这两个函数。

1.

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();
    }

2.

 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();
    }

如果我在主函数中调用这两个函数。第1个函数会抛出

java.lang.NullPointerException error. 

据我了解,当java.lang.NullPointerException发生时。

  • 1. 当声明一个变量但没有创建一个对象时。
  • 2.在尝试使用变量的内容之前,先将其赋值给变量

    (这部分的更新。在IF条件之后,不管有无 else,都会执行正文的其他部分,谢谢大家的帮助)

    (陈旧。忽略其余部分:)

    if(root == null) 
    

    其余的应该是

    root != null
    

    如果我说错了,请纠正我。

  • java binary-tree
    1个回答
    2
    投票

    回答

    你缺少一个 else case。

    private String preorder(TreeNode root) {
        if(root == null){
          sb.append("null,");  
        }else{ 
        // ... 
        }
    

    你的if条件下面的代码 仍将执行 如果你不加 elsereturn.

    它将抛出一个NPE,因为在你的条件之后,你试图访问 root 与。

    sb.append(root.val);

    进一步解释

    你需要把它当作一个句子来读。

    if(thisIsTrue){
      // Then do that
    }else{
      // Do that
    }
    

    其中 "thisIsTrue "是你的条件,即 root != null.

    如果你试图访问root的一个成员,并使用 root.val的地方,在那里你可以尝试访问 val则根 不得为空,或一个 NullPointerException 会被扔掉。

    比喻说.想象你有一袋苹果.你想做的是抓一个苹果,但你没有袋子。

    我想这就很清楚了。

    如果你省略了 else 子句,那么它将会像下面这样执行。

    if(thisIsTrue){
      // It will do that, if condition is true
    }
    
    // It will ALWAYS execute this, even if condition is false
    
    1. 用ifelse你开两支。只有 一个 的人被处决。

    2. 与如果,但没有其他你有一个条件分支,如果条件为真就会被执行,但下面的代码会被执行。始终 之后.

    © www.soinside.com 2019 - 2024. All rights reserved.