我正在使用Java S2SE制作一个简单的原型项目。目标是创建一个文本文件,逐行读取,填充一个链表,然后要求用户输入名字和第二个名字。
文本文件的格式为:
firstnamessecondname移动家庭mobile2办公室
contact1contact2 mobileshomes mobile2s办公室
我将文本文件中的第一个名字和第二个名字连接起来。
然后,我要求用户输入第一个和第二个名字,并使用这两个字符串的连接,将搜索已填充的链表。无论在哪里出现包含具有这些名和名的字符串的节点,拆分该节点并显示该节点的结果 我的代码是:try {
String fullname;
String mobile;
String home;
String mobile2;
String office;
Node current=first;
while(current.data == null ? key !=null : !current.data.equals(key)) {
String splitter[]=current.next.data.split(" ");
//fullname=splitter[9];
mobile=splitter[1];
home=splitter[2];
mobile2=splitter[3];
office=splitter[4];
if(current.next.data.split(" ")==null?key==null:){
mobilefield.setText(mobile);
homefield.setText(home);
mobilefield2.setText(mobile2);
officefield.setText(office);
} else {
throw new FileNotFoundException("SORRY RECORD NOT LISTED IN DATABASE");
}
break;
}
} catch(Exception e) {
JOptionPane.showMessageDialog(this,e.getMessage()
+"nPLEASE TRY AGAIN !","Search Error", JOptionPane.ERROR_MESSAGE);
}
问题是,一切都很好,但是搜索列表中的第一个和第n-1个节点出错了,但是在搜索中没有到达最后一个节点
乍一看,您正在尝试引用一个可能为空的next
节点。
current.next.data
可能是null
,如果是这种情况,那么您将得到NPE。
你的循环应该专注于它正在处理的 with 部分-也就是说,一个大小为n的链表,当我得到n的节点 I 时,我应该执行this。
同样,您不应该在一个没有数据的节点中工作。跳过空的
while(current.data != null)
最后,推进current
引用,否则将无限循环。
current = current.next;
另一个观察:
- 在编辑时,我不知道从上下文中是否这两行应该在同一行。如果是这种情况,那么您可能希望使用常量来代替原始整数来指示要去哪里-例如,您正在寻找的名称将在
[0]
中,可以称为FULL_NAME
。
根据你的问题,我修改了你的代码。这应该可以工作:
try {
String fullname;
String mobile;
String home;
String mobile2;
String office;
Node current;
//This loop will start from the first `Node`, check for `null`, then check if it is equal to the `key`. If not, then it will advance to `next`
for(current=first; current!=null && !current.data.equals(key); current = current.next);
//the loop will terminate if current is null or is equal to key. If it is equal to key, we should display data.
if(current.data.equals(key))
{
String splitter[]= current.data.split(" ");
fullname=splitter[0];
mobile=splitter[1];
home=splitter[2];
mobile2=splitter[3];
office=splitter[4];
mobilefield.setText(mobile);
homefield.setText(home);
mobilefield2.setText(mobile2);
officefield.setText(office);
}
else
throw new FileNotFoundException("SORRY RECORD NOT LISTED IN DATABASE");
} catch(Exception e) {
JOptionPane.showMessageDialog(this,e.getMessage()
+"nPLEASE TRY AGAIN !","Search Error", JOptionPane.ERROR_MESSAGE);
EDIT:添加注释