Java 为什么在我的代码中为空对象赋值不起作用?我的代码有一个用于二进制搜索树的简单插入函数:
现在在二进制搜索树类中,我有一个插入函数:Java 为什么在我的代码中为空对象赋值不起作用?我的代码有一个用于二进制搜索树的简单插入函数:,java,nullpointerexception,Java,Nullpointerexception,现在在二进制搜索树类中,我有一个插入函数: public class Node { Node left; Node right; int value; public Node(int value){ this.value = value; this.left = null; this.right = null; } public void printValue(){
public class Node {
Node left;
Node right;
int value;
public Node(int value){
this.value = value;
this.left = null;
this.right = null;
}
public void printValue(){
System.out.println("Node value = "+this.value);
}
}
此代码在打印根目录后出现空指针异常。当“当前”值为空时,“插入”函数中未分配该值
但是,以下对insert函数的修改可解决此错误:
public class GTDriver {
public static void main(String[] args) {
BinarySearchTree bt = new BinarySearchTree(50);
bt.insert(45, bt.root);
bt.insert(65, bt.root);
bt.root.printValue();
bt.root.left.printValue();
bt.root.right.printValue();
}
}
public void插入(int值,节点根){
节点电流=根;
节点n=新节点(值);
while(当前!=null){
如果(值>当前值)
if(current.right!=null)
current=current.right;
否则{
current.right=n;
打破
}
否则如果(值<当前值)
if(current.left!=null)
current=current.left;
否则{
当前左=n;
打破
}
}
}
为什么上一个插入功能不起作用?中
public void insert(int value, Node root){
Node current = root;
Node n = new Node(value);
while(current != null){
if (value > current.value)
if (current.right != null)
current = current.right;
else{
current.right = n;
break;
}
else if (value < current.value)
if (current.left != null)
current = current.left;
else{
current.left = n;
break;
}
}
}
两者
为null,因此您将获得NullPointerException
公共void插入(int值,节点根){
节点电流=根;
节点n=新节点(值);
while(当前!=null){
如果(值>当前值)
current=current.right;
否则如果(值<当前值)
current=current.left;
}
current=n;//n.right=null和n.left=null。因此,current.right和current.left=null。
}
在第二种情况下
Node current = root;
Node n = new Node(value);
while(current != null){
if (value > current.value)
current = current.right;
else if (value < current.value)
current = current.left;
}
current = n; // n.right=null and n.left=null. So, current.right and current.left=null.
}
if(值>当前值)
if(current.right!=null)
current=current.right;
否则{
current.right=n;//right!=null
打破
}
否则如果(值<当前值)
if(current.left!=null)
current=current.left;
否则{
current.left=n;//left!=null
分析非常简单。在您的第一个插入版本中,您的根对子节点的引用为null(左侧和右侧为null)。插入方法实际上不起任何作用,因为:
if (value > current.value)
if (current.right != null)
current = current.right;
else{
current.right = n; //right!=null
break;
}
else if (value < current.value)
if (current.left != null)
current = current.left;
else{
current.left = n; // left!=null
节点电流=根;
节点n=新节点(值);
while(当前!=null){
如果(值>当前值)
current=current.right;//空赋值!
}否则如果(值<当前值){
current=current.left;//空赋值!
}
}
//这里的电流为零
然后创建一个新节点n,但忘记将其分配到根节点的左侧和右侧。插入时忘记分配左侧和右侧节点 我建议使用递归,而不是使用迭代方法。这很容易
Node current = root;
Node n = new Node(value);
while (current != null) {
if (value > current.value)
current = current.right; // null assignment!
} else if (value < current.value) {
current = current.left; // null assignment!
}
}
// here current is null
编辑:我只是编辑了这篇文章以使其正确。回答错误!当您在根变量中传递null值时,这段代码会出现null指针异常。您所犯的错误将在下面的问题中讨论:哦,好吧,我的错误。我还没有在java上测试过这个
Node current = root;
Node n = new Node(value);
while(current != null){
if (value > current.value)
current = current.right;
else if (value < current.value)
current = current.left;
}
current = n; // n.right=null and n.left=null. So, current.right and current.left=null.
}
if (value > current.value)
if (current.right != null)
current = current.right;
else{
current.right = n; //right!=null
break;
}
else if (value < current.value)
if (current.left != null)
current = current.left;
else{
current.left = n; // left!=null
Node current = root;
Node n = new Node(value);
while (current != null) {
if (value > current.value)
current = current.right; // null assignment!
} else if (value < current.value) {
current = current.left; // null assignment!
}
}
// here current is null
public void insert(int value, Node root){
if (root == null) {
root = new Node(value);
} else {
if (root.getValue() >= value) {
if (root.getRight() == null) {
root.setRight(new Node(value));
} else {
root.insert(value, root.getRight());
}
} else {
if (root.getLeft() == null) {
root.setLeft(new Node(value));
} else {
root.insert(value, root.getLeft());
}
}
}
}