Почему без 'else', это вызовет исключение java .lang.NullPointerException при обходе преодера BTree? - PullRequest
0 голосов
/ 29 апреля 2020

Я новичок в программировании. Мой вопрос может быть глупым. (*** Если для других нет значения, я удалю этот вопрос позже). См. Эти две функции здесь:

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, независимо от того, имеется ли другое или нет, он выполнит оставшуюся часть тела, спасибо всем за помощь)

(Устаревший. Игнорировать остальную часть:)

После

if(root == null) 

остальное должно быть

root != null

Поправьте меня, если я неправильно.

1 Ответ

2 голосов
/ 29 апреля 2020

Ответ

Вы пропустили еще один случай.

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

Код ниже вашего условия if все равно выполнит , если вы не добавите else или return.

Он бросит NPE, потому что после вашего состояния вы пытаетесь получить доступ к root с помощью:

sb.append(root.val);

Дальнейшее объяснение

Вам необходимо прочитайте это как предложение.

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

Где "thisIsTrue" - ваше состояние. то есть root != null.

Если вы попытаетесь получить доступ к члену root с помощью root.val, где вы пытаетесь получить доступ val, то root не должно быть нулевым или NullPointerException будет брошено.

Образно говоря ... представьте, что у вас есть мешок яблок. То, что вы пытаетесь сделать, это захватить яблоко, но у вас нет сумки.

Я думаю, это понятно.

Если вы пропустите предложение else, оно будет выполнено следующим образом:

if(thisIsTrue){
  // It will do that, if condition is true
}

// It will ALWAYS execute this, even if condition is false
  1. с помощью if / else Вы открываете две ветви , Только один из них исполняется.

  2. С помощью if, но не иначе У вас есть одна условная ветвь, которая исполняется, если условие истинно, но код ниже будет выполняться всегда впоследствии .

...