2010-05-12 102 views
4

注意:如果您不想要,这是家庭作业/任务感觉不应答。NullPointerException和处理它的最佳方式

一些搜索后,确定并阅读这些:

How to check if array element is null to avoid NullPointerException in Java Gracefully avoiding NullPointerException in Java http://c2.com/cgi/wiki?NullPointerException

现在还不能就如何处理NullPointerException异常错误在我的代码的任何进展,片段为可疑代码:

int findElement(String element) { 
      int retval = 0; 

      for (int i = 0; i < setElements.length; i++) { 
       if (setElements[i].equals(element)) { // This line 31 here 
        return retval = i; 

       } 
       else { 
        return retval = -1; 
       } 
      } 

      return retval; 
     } 

     void add(String newValue) { 
      int elem = findElement(newValue); 
      if(numberOfElements < maxNumberOfElements && elem != -1) { 
       setElements[numberOfElements] = newValue; 
       numberOfElements++; 
      } else { System.out.println("Element " + newValue + "already exist"); } 
     } 

它编译但向集添加新元素会引发NullPointerException错误。

D:\javaprojects>java SetDemo 
Enter string element to be added 
A 
You entered A 
Exception in thread "main" java.lang.NullPointerException 
     at Set.findElement(Set.java:31) 
     at Set.add(Set.java:44) 
     at SetDemo.main(Set.java:145) 

我增加了一个检查,但老实说,没有线索,如果这项权利管线31 如果(setElements!= NULL & & setElements [I] .equals(元素)),但仍然没有喜悦。

非常感谢文档/提示或解释。

学习, 羽扇

+2

使用调试器。 – bmargulies 2010-05-12 01:22:35

回答

4

你初始化setElements地方?含义:

String[] setElements = new String[100]; 

如果你简单地声明数组变量:

String[] setElements; 

,因为它被初始化为null类的数据成员。你必须使它指向某些东西。你可以这样做在线:

public class MyClass { 
    private String[] setElements = new String[100]; 
    ... 
} 

或在构造函数中:

public class MyClass { 
    private String[] setElements; 

    public MyClass() { 
    setElements = new String[100]; 
    } 
    ... 
} 
3

应该setElements[i] != null && setElements[i].equals(element)。如果集合包含空元素,那么当您调用该元素上的equals方法时,您将尝试解引用空引用。

至于NullPointerException - 你应该从来没有赶上它。对于不应该为null的内容,它们必须正确初始化。对于那些不能为空的东西 - 在解引用它们(即调用它们的方法)之前,必须检查它们是否为null。

捕获NullPointerException的唯一用例是当您使用的第三方库没有源代码时,并且导致引发NullPointerException的错误。这些情况很少见,因为你只是开始学习Java,忘记我提到了这一点,并专注于更重要的事情。

+0

我想你的意思是 “空指针异常” 的NullReferenceException是一个C#/。NET的事情,但这个问题是关于Java的。 – 2010-05-12 02:09:02

+0

那的确是我的意思是,谢谢你的纠正, – 2010-05-12 02:18:01

1

尝试测试元素本身为空,而不是数组:

setElements[i] != null && setElements[i].equals(element) 
3

的for循环findElement没有意义。

for (int i = 0; i < setElements.length; i++) { 
       if (setElements[i].equals(element)) { // This line 31 here 
        return retval = i; 

       } 
       else { 
        return retval = -1; 
       } 
      } 

你应该返回-1前通过所有值迭代,只有这样你才能知道存在匹配element设定的任何元素。

+1

+1,但它不会回答这个问题。:) – 11684 2012-10-02 12:06:44

1

您不应该尝试捕获空指针异常。相反,为了避免空指针的最好办法是:

  • 在你假设参数为非空是需要参数的任何功能,随时检查参数为非空,抛出IllegalArgumentException如果是空值。
  • 每当您调用一个不允许空参数的函数时,请确保您没有将空指针传递给该函数;如果你已经知道该对象是非空的(因为你已经检查过它并且会抛出一个IllegalArgumentException),那么你不需要重新检查;否则,在传递它之前,您应该仔细检查该对象是否为非空。

由于您不检查参数到您的findElement并添加函数,所以参数很可能是罪魁祸首。如果它们为空,添加适当的检查并抛出IllegalArgumentException。如果在你这样做后,你会得到一个IllegalArgumentException,那么你已经解决了你的问题。如果没有,那么你至少知道问题不是参数,而是代码中的其他地方。

3

发布整个班级 - 此片段无用。

你犯了两个严重的错误:不相信编译器,并假设你的代码是正确的。

如果JVM告诉你第31行是问题,请相信它。

我的猜测是setElements[i]为空。

0

它的工作现在,谢谢拉尔斯,伊戈尔和其他谁花时间批评的代码,有一个逻辑错误,不检查,无论如何这里是更正的工作代码,最后我很费心我做作弊? :(

int findElement(String element) { 
      int retval = 0; 

      for (int i = 0; i < setElements.length; i++) { //loop first to the array and only return -1 once we can't find it.   
     //setElements[i] != null is the NullPointerException killer :) 


       if (setElements[i] != null && setElements[i].equals(element)) { 
        return retval = i; 

       } 
      retval = -1; 
      } 

      return retval; 
     } 

     void add(String newValue) { 
      int elem = findElement(newValue); 
      if(numberOfElements < maxNumberOfElements && elem == -1) { # == instead of != as I only need to add if elements is non-existing 
       setElements[numberOfElements] = newValue; 
       numberOfElements++; 
      } 
     } 

与感谢, 羽扇

+0

不要忘记对你认为有用的答案进行回答。 – trashgod 2010-05-12 02:23:35

+0

顺便说一句,如果您使用java.util.List实现之一而不是String数组,则可以完全清除findElement方法并使用List.indexOf(Object)。当然,你的作业可能不允许你这样做。 – fish 2010-05-12 07:30:09