我正努力在今年的算法课上提前工作:D和我正在做课堂工作(所以它没有标记或评估,但仅仅是为了练习我想要导致一个课程作业)
无论如何 - 我们已经获得了一个名称列表作为文本文件,采用以下格式
"surname, first name"
每个项目都有一个条目号(目前不相关)
我们要使用他给我们的半psudo代码示例重写搜索方法,这是我遇到的问题。 (最初阵列的搜索方法如下)
/**
* Look a name and return the number or null if there is no match
*/
public String search(String name)
{
for (int i = 0; i < length; i++) {
if (name.equals(list[i].getName())) {
return list[i].getNumber();
}
}
return null;
}
演讲幻灯片中的文字描述说我们可以通过以下方式实施;
1) Use variables to store the start-index and length of the sequence of array elements that must contain this entry if there is one.
2) Set start-index to 0 and length to the array length.
3) while length is greater than 1
a) Compare Mike with the name in the middle element (at start_index + length/2)
b) If it is earlier then set length to length/2 and leave start-index as it is.
c) If it is later or equal then add length/2 to start-index and subtract length/2 from length
4) length is now 1 so it must be Mike's entry if he has one
这是我到目前为止的实现,但我一直在
上获得空指针异常java.lang.NullPointerException
at PhoneBook.search(PhoneBook.java:73) (if(name.comeToIgnoreCase... )
at PhoneBook.testSearch(PhoneBook.java:57)
public String search (String name)
{
int startIndex = 0;
int length = list.length;
while(length > 1){
if(name.compareToIgnoreCase(list[startIndex + (length / 2)].getName()) > 0) {
length = length / 2;
}
else {
startIndex = startIndex + (length / 2);
length = length - (length / 2);
}
if (length == 1){
return list[length].getName();
}
}
return null;
}
答案 0 :(得分:1)
好吧,name
可能为null,或list
可能为null,或list[startIndex + (length / 2)]
可能为null,因此在第57行之前插入所有这些内容:
if (null == name) throw new NullPointerException ("name is null");
if (null == list) throw new NullPointerException ("list is null");
if (null == list[startIndex + (length / 2)]) {
throw new NullPointerException ("list[" + (startIndex + (length / 2)) + "] is null");
}
当您知道哪一个为null时,您可以开始调查它为空的原因。
Btw(与您的问题无关)您的方法中的此代码包含两个错误:
if (length == 1){
return list[length].getName();
}
答案 1 :(得分:0)
假设代码是给定的并且NPE在search
中抛出,仅可能的解释是search
方法的其中一个输入无效:
name
是null
,list
是null
或list
的其中一个元素是null
。因此,您需要查看为根本原因调用search
的代码。
(这并不是说search
必然是正确的。但你需要首先解决上面的问题。)