Java NullPointerException及其最佳处理方法
注意:这是作业/作业,如果你不想回答,请不要回答 搜索并阅读以下内容后确定: 在如何处理代码中的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
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++;
}
}