Java在泛型类中避免空指针异常

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”是空的,所以我不能用它来比较 问题是:

好的,这是我的两个类。我的目标是使用泛型类在OBT中插入。在这种情况下,我尝试使用字符串。当我在main中调用insert方法时,我得到:

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)
。在<代码>查找()中考虑这个问题,代码应该> <代码>数据。也可以在<代码>查找()()中考虑这一点。