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

时间:2015-04-29 12:31:39

标签: java generics nullpointerexception binary-tree

好的,这是我的两个类。我的目标是使用泛型类在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 

2 个答案:

答案 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对象上调用datadata.compareTo(insertData);,但datanull,它& #39;喜欢写作:

int compare = null.compareTo(insertData);

会导致NullPointerException

带有奖金提示的解决方案:

在使用setData(insertData);对象之前

data

提示:请使用调试器,它可以帮助您。当您使用它时,您将更好地理解程序的流程。