我有问题。我做了以下程序,因为我想创建一个二叉树节点,让实例化器创建一堆树节点,然后让计数器计算节点和叶子。我的问题是这样的:当我调用BTNode(null,null,null)时,我一直得到一个空指针异常。进一步:我必须为这些值设置null,节点按定义指向其他节点,当你实例化root时,右边和左边没有其他节点指向,所以它必须为null。由于某种原因,这完全与java有关,它会抛出一个空指针异常。原因:我没有任何线索,在声明新的BTNode并将其分配为左右之前,我甚至都没有引用这些值。此外,它甚至没有通过构造函数!
请帮忙!
public class binarytree {
static int nodeCounter=0;
static int leafCounter=0;
public static class BTNode{
char c;
BTNode left;
BTNode right;
public BTNode(Character d, BTNode left1, BTNode right1){
c=d;left=left1;right=right1;}
}
public static void Instantiator(BTNode root){
int counter=10;
Instantiator1(root,counter);
}
public static void Instantiator1(BTNode root,int counter){
if (counter<=0){
return;}
BTNode a=new BTNode(null,null,null);
BTNode b=new BTNode(null,null,null);
root.left=a;
root.right=b;
counter--;
Instantiator1(a,counter);
Instantiator1(b,counter);
}
public static int Testleaf(BTNode n){
if(n.left==null && n.right==null)
return 1;
else return 0;
}
public static int Testnode(BTNode n){
if(!(n.left==null && n.right==null))
return 1;
else return 0;
}
public static void printNodesandLeaves(BTNode root){
counter(root);
System.out.println("Nodes are"+nodeCounter);
System.out.println("leaves are"+leafCounter);
}
public static void counter(BTNode r){
nodeCounter+=Testnode(r);
leafCounter+=Testleaf(r);
if (!(r.left==null))
counter(r.left);
if (!(r.right==null))
counter(r.right);}
public static void main(String[] args){
BTNode root=new BTNode(null,null,null);
Instantiator(root);
printNodesandLeaves(root);
}}
答案 0 :(得分:3)
自动取消装箱NullPointerException
到(Character) null
时,您获得char
。
你的构造函数
public BTNode(Character d, BTNode left1, BTNode right1){
c=d;left=left1;right=right1;
}
获取Character
并将其分配给
char c;
这在技术上是合法的,因为自动装箱但d
为null
时相当于
c = ((Character) null).charValue()
会产生NullPointerException
。
你不应该不必要地使用Character
,所以我会重写对构造函数的调用
BTNode((char) 0, null, null)
并更改BTNode
的签名以取char
而不是Character
,但您也可以将c=d;
更改为
c = d != null ? d.charValue() : (char) 0;