Java NullPointerException及其最佳处理方法

Java NullPointerException及其最佳处理方法,java,null,nullpointerexception,Java,Null,Nullpointerexception,注意:这是作业/作业,如果你不想回答,请不要回答 搜索并阅读以下内容后确定: 在如何处理代码中的NullPointerException错误方面,我仍然没有取得任何进展,有问题的代码片段: int findElement(String element) { int retval = 0; for ( int i = 0; i < setElements.length; i++) { if ( setElemen

注意:这是作业/作业,如果你不想回答,请不要回答

搜索并阅读以下内容后确定:

在如何处理代码中的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"); }
       }
我又加了一张支票,不过老实说,我不知道这是否是第31行的权利。 如果(setElements!=null&&setElements[i].equals(element)),但仍然没有乐趣

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

学习,
卢平

您是否在任何地方初始化了
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];
  }
  ...
}

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

至于
NullPointerException
,您应该永远不要捕获它。对于不应为null的内容,必须正确初始化它们。对于那些不能为null的东西,必须在取消引用它们之前检查它们是否为null(即对它们调用方法)


捕获
NullPointerException
的唯一用例是当您使用的第三方库没有源代码,并且存在导致抛出
NullPointerException
的错误时。这些情况很少见,因为您才刚刚开始学习Java,所以请忘记我提到过这一点,集中精力解决更重要的问题。

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

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

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;
               }
           }
for(int i=0;i

在返回-1之前,您应该遍历所有值,只有这样您才知道集合中没有与
元素
匹配的元素。您不应该尝试捕获空指针异常。相反,避免空指针的最佳方法是:

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

因为您没有检查findElement和add函数的参数,所以很可能是这些参数造成的。添加适当的检查,如果它们为null,则抛出IllegalArgumentException。如果,在你这样做之后,你得到了一个IllegalArgumentException,那么你已经解决了你的问题。如果不是,那么您至少知道问题不在于参数,而在于代码中的其他地方。

发布整个类-此代码段没有用处

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

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


我猜,
setElements[i]
是空的。

它现在可以工作了,多亏拉尔斯、伊戈尔和其他人花时间批评代码,有一个逻辑错误没有被检查,不管怎样,这是正确的工作代码,最后我很抱歉我在作弊吗?:(

int findElement(字符串元素){
int-retval=0;
对于(inti=0;i
谢谢你,
卢平

我想你的意思是“NullPointerException”。NullReferenceException是一个C#/.NET的东西,但这个问题是关于Java的。顺便说一下,如果您使用一个Java.util.List实现而不是字符串数组,那么您可以完全摆脱findElement方法,而改为使用List.indexOf(Object)。当然,你的家庭作业中可能不允许这样做。
for ( int i = 0; i < setElements.length; i++) {
               if ( setElements[i].equals(element) ) {  // This line 31  here
                  return retval = i;

               }
               else {
                   return retval = -1;
               }
           }
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++;
            } 
       }