好的,这是我的两个类。我的目标是使用泛型类在OBT中插入。在这种情况下,我正在尝试使用Strings。当我在主要调用insert方法时,我一直得到:
Exception in thread "main" java.lang.NullPointerException
at OBTComparable.insert(OBTComparable.java:37)
at FindTest.main(FindTest.java:12)
我发现了问题:因为var"数据"为空,我无法用它进行比较。
问题: 我怎样才能更改"数据"避免空指针异常(它将是一个字符串)。
Generic OBTC Comparable class:
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
测试类:
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
答案 0 :(得分:3)
在您致电data
之前引用setData
的任何方法中,您都会遇到此问题。
重写插入以解决这个问题
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);
}
}
您需要对find()
您还应该将Optional
视为表示可能为null的值的方法。理想情况下,对象的状态将在构造函数中设置,因此您可以立即拥有有效对象。
答案 1 :(得分:2)
让我们从您的main
方法开始:
OBTComparable<String> obt = new OBTComparable<String>();
您初始化obt
对象,因此调用构造函数,它有一个方法调用setEmpty()
,此方法将data
设置为null
。
然后,main
中的下一个语句:
obt.insert(insertStrings[i]);
在第一行中,您在compareTo
对象上调用data
:data.compareTo(insertData);
,但data
为null
,它& #39;喜欢写作:
int compare = null.compareTo(insertData);
会导致NullPointerException
。
带有奖金提示的解决方案:
在使用setData(insertData);
对象之前 data
。
提示:请使用调试器,它可以帮助您。当您使用它时,您将更好地理解程序的流程。