注意:如果你不愿意,这是家庭作业/作业不回答。
一些搜索和阅读之后好了:
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))但仍然没有快乐。
非常感谢文档/提示或解释。
学习, 羽扇豆
答案 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)
您不应该尝试捕获空指针异常。相反,避免空指针的最佳方法是:
由于您没有检查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++;
}
}
谢谢,
羽扇豆