NullPointerException和处理它的最佳方法

时间:2010-05-12 01:19:14

标签: java null 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号线的话,请不要有任何线索。 if(setElements!= null&amp;&amp; setElements [i] .equals(element))但仍然没有快乐。

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

学习, 羽扇豆

7 个答案:

答案 0 :(得分: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];
  }
  ...
}

答案 1 :(得分:3)

应该是setElements[i] != null && setElements[i].equals(element)。如果集合包含null元素,则在该元素上调用equals方法时,将尝试取消引用空引用。

至于NullPointerException - 您应该永远抓住它。对于不应为null的事物,必须正确初始化它们。对于那些不能为null的东西 - 在取消引用它们之前必须检查它们(即调用它们的方法)。

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

答案 2 :(得分:3)

findElement中的for循环没有意义。

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匹配的元素。

答案 3 :(得分:3)

发布整个课程 - 这个片段没用。

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

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

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

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

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

由于您没有检查findElement的参数并添加函数,因此很可能参数是罪魁祸首。添加相应的检查并抛出IllegalArgumentException(如果它们为null)。如果在执行此操作后,您收到IllegalArgumentException,那么您已经解决了问题。如果没有,那么你至少知道问题不是参数,而是代码中的其他地方。

答案 6 :(得分:0)

它现在正在工作,感谢Lars,Igor和其他花时间批评代码的人,有一个逻辑错误没有检查,无论如何这里是纠正的工作代码,最后我很烦我在做作弊? :(

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++;
            } 
       }
谢谢, 羽扇豆