我正在尝试在java中实现二进制树,这是我的代码:
class TestClass {
public static void newnode(int a , Node root,){
root = new Node(a);
System.out.println(root.data); // Printing out 22
}
public static void main(String args[] ) throws IOException {
Node root = null;
newnode(22,root);
System.out.println(root.data); // Giving NullPointerException
}
}
class Node{
Node left ;
Node Right;
int data ;
Node(int dataa){
this.data = dataa;
}
}
我无法在树中插入新节点,root的值不会改变
当我调用newnode函数时,我得到了我的根节点的正确值,但是在main函数中它给出了我的零点异常
为什么root的值没有更新
答案 0 :(得分:1)
class TestClass {
public static Node newnode(int a , Node root){
root = new Node(a);
System.out.println(root.data); // Printing out 22
return root;
}
public static void main(String args[] ) throws IOException {
Node root = null;
root = newnode(22,root);
System.out.println(root.data); // Giving NullPointerException
}
}
试试这个
答案 1 :(得分:0)
来自Passing Reference Data Type Arguments
引用数据类型参数(如对象)也按值传递给方法。这意味着当方法返回时,传入的引用仍然引用与以前相同的对象。但是,如果对象的字段具有适当的访问级别,则可以在该方法中更改它们的值。
Java传递参数作为Pass-by-Value而不是引用:所以你给定的代码:
public static void main(String args[] ) throws IOException {
Node root = null;
newnode(22,root); // you are passing root
System.out.println(root.data); // Giving NullPointerException because its pass by value
}
正确的方法可能是:
public static Node newnode(int a , Node root){
root = new Node(a);
System.out.println(root.data); // Printing out 22
return root;
}
public static void main(String args[] ) throws IOException {
Node root = null;
root = newnode(22,root);
System.out.println(root.data); // NO NullPointerException
}
答案 2 :(得分:0)
您不应该设计具有大量输入参数的方法,因为测试会更加痛苦。此外,没有必要将null传递给方法只是为了给它分配一个对象 - 这是糟糕的设计。
import java.io.IOException;
class TestClass {
// This method is useless, use Factory Design Pattern if you want
// to create such solution with multiple variants
public static Node newNode(int a) {
return new Node(a);
}
public static void main(String args[]) throws IOException {
Node root = newNode(22);
System.out.println(root.getData());
}
}
class Node {
private int data;
private Node left;
private Node right;
public Node(int data) {
this.data = data;
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
public Node getLeft() {
return left;
}
public void setLeft(Node left) {
this.left = left;
}
public Node getRight() {
return right;
}
public void setRight(Node right) {
this.right = right;
}
}