Java在泛型类中避免空指针异常
好的,这是我的两个类。我的目标是使用泛型类在OBT中插入。在这种情况下,我尝试使用字符串。当我在main中调用insert方法时,我得到:Java在泛型类中避免空指针异常,java,generics,nullpointerexception,binary-tree,Java,Generics,Nullpointerexception,Binary Tree,好的,这是我的两个类。我的目标是使用泛型类在OBT中插入。在这种情况下,我尝试使用字符串。当我在main中调用insert方法时,我得到: Exception in thread "main" java.lang.NullPointerException at OBTComparable.insert(OBTComparable.java:37) at FindTest.main(FindTest.java:12) 我发现了这个问题:因为var“data”是空的,所以我不能用它来比较 问题是:
Exception in thread "main" java.lang.NullPointerException
at OBTComparable.insert(OBTComparable.java:37)
at FindTest.main(FindTest.java:12)
我发现了这个问题:因为var“data”是空的,所以我不能用它来比较
问题是:
如何更改“数据”以避免空指针异常(它将是一个字符串)
通用类:
public class OBTComparable<Type extends Comparable<Type>>
{
private boolean empty;
private Type data;
private OBTComparable left;
private OBTComparable right;
public OBTComparable()
{
setEmpty();
}
private void setEmpty()
{
empty = true;
data = null; /////////////////// THE PROBLEM //
left = null;
right = null;
}
private void setData(Type reqData)
{
if (empty)
{
empty = false;
left = new OBTComparable();
right = new OBTComparable();
}
data = reqData;
}
public void insert(Type insertData)
{
int compare = data.compareTo(insertData); /////////////// HERE ALSO
if (empty)
setData(insertData);
else if (compare < 0)
left.insert(insertData);
else
right.insert(insertData);
}
public boolean find(Type findData)
{
int compare = findData.compareTo(data);
if (empty)
return false;
else if (compare == 0)
return true;
else if (compare < 0)
return left.find(findData);
else
return right.find(findData);
}
public int compareTo(OBTComparable<Type> other)
{ return 0; }
} // class
公共类
{
私有布尔空;
私有类型数据;
私家车,左;
私权;
公共服务
{
setEmpty();
}
私有void setEmpty()
{
空=真;
data=null;//问题//
左=空;
右=空;
}
私有void setData(类型reqData)
{
if(空)
{
空=假;
左=新的();
右=新的();
}
数据=reqData;
}
公共void insert(类型insertData)
{
int compare=data.compareTo(insertData);//这里还有
if(空)
setData(插入数据);
否则如果(比较<0)
左。插入(插入数据);
其他的
右。插入(insertData);
}
公共布尔查找(类型findData)
{
int compare=findData.compareTo(数据);
if(空)
返回false;
否则如果(比较==0)
返回true;
否则如果(比较<0)
返回左侧。查找(findData);
其他的
返回right.find(findData);
}
公共国际比较(其他)
{返回0;}
}//类
测试等级:
public class Test
{
public static void main(String[] args)
{
OBTComparable<String> obt = new OBTComparable<String>();
String [] insertStrings =
new String [] { "My", "name", "is", "Mark", "Smith", "and", "my",
"hobbies", "include", "films", "music", "computing" };
for (int i = 0; i < insertStrings.length; i++)
{
obt.insert(insertStrings[i]); //////////// HERE ALSO
System.out.println("Inserting" + insertStrings[i]);
}
} // main
} // class
公共类测试
{
公共静态void main(字符串[]args)
{
obt可比obt=新obt可比();
字符串[]插入字符串=
新字符串[]{“My”、“name”、“is”、“Mark”、“Smith”、“and”、“My”,
“爱好”、“包括”、“电影”、“音乐”、“计算机”};
for(int i=0;i
让我们从您的main
方法开始:
OBTComparable<String> obt = new OBTComparable<String>();
在它的第一行,您在data
对象上调用compareTo
:data.compareTo(insertData)
,但是数据
是空的
,这就像写:
int compare = null.compareTo(insertData);
这会导致出现NullPointerException
有奖金提示的解决方案:
setData(插入数据)使用数据
对象之前,先执行code>
提示:请使用调试器,它会帮助您。当您使用程序时,您将真正更好地了解程序的流程。让我们从您的main
方法开始:
OBTComparable<String> obt = new OBTComparable<String>();
在它的第一行,您在data
对象上调用compareTo
:data.compareTo(insertData)
,但是数据
是空的
,这就像写:
int compare = null.compareTo(insertData);
这会导致出现NullPointerException
有奖金提示的解决方案:
setData(插入数据)使用数据
对象之前,先执行code>
提示:请使用调试器,它会帮助您。在使用程序时,您将真正更好地了解程序的流程。在调用setData
之前,在任何引用数据的方法中,您都会遇到此问题
重写insert以绕过此问题
public void insert(Type insertData)
{
if (empty)
{
setData(insertData);
}
else
{
int compare = data.compareTo(insertData);
if (compare < 0)
left.insert(insertData);
else
right.insert(insertData);
}
}
public void insert(键入insertData)
{
if(空)
{
setData(插入数据);
}
其他的
{
int compare=data.compareTo(insertData);
如果(比较<0)
左。插入(插入数据);
其他的
右。插入(insertData);
}
}
您需要对find()
您还应该将可选作为表示可能为空的值的一种方式。理想情况下,对象的状态将在构造函数中设置,以便立即获得有效对象。在调用setData
之前引用数据的任何方法中,都会遇到此问题
重写insert以绕过此问题
public void insert(Type insertData)
{
if (empty)
{
setData(insertData);
}
else
{
int compare = data.compareTo(insertData);
if (compare < 0)
left.insert(insertData);
else
right.insert(insertData);
}
}
public void insert(键入insertData)
{
if(空)
{
setData(插入数据);
}
其他的
{
int compare=data.compareTo(insertData);
如果(比较<0)
左。插入(插入数据);
其他的
右。插入(insertData);
}
}
您需要对find()
您还应该将可选作为表示可能为空的值的一种方式。理想情况下,对象的状态将在构造函数中设置,以便立即获得有效的对象。在检查对象是否为空后,应在insert()中执行data.compareTo(insertData)
。在<代码>查找()中考虑这个问题,代码应该> <代码>数据。也可以在<代码>查找()()中考虑这一点。