Ответ
Вы пропустили еще один случай.
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
с помощью if / else Вы открываете две ветви , Только один из них исполняется.
С помощью if, но не иначе У вас есть одна условная ветвь, которая исполняется, если условие истинно, но код ниже будет выполняться всегда впоследствии .