public class LString{
char data; //chars stored in this node
LString next; //link to next LString node
public LString(char newdata){
data = newdata;
}
public LString(char newdata, LString newnext){
data = newdata;
next = newnext;
}
public LString(){
}
//create a front of list
LString front;
//create length of list
int length;
/*Construct an LString object. The LString object will represent the
same list of chars as original. That is, the newly created LString is a
"copy" of the parameter original.*/
public LString(String original){
LString curr = front;
for(int i = 0; i < original.length(); i++){
curr.data = original.charAt(i);
curr = curr.next;
length++;
}
}
}
public class test{
public static void main(String[] args){
LString myList = new LString("hi");
}
}
下面的代码应该将字符串"hi"放入字符的链接列表中,其中每个字母 hi 都是列表的一个节点。运行时,它会给出一个指向行curr.data = original.charAt(i);的空指针异常。为什么那里有空指针异常?谢谢
在你的循环中:
public LString(String original){
LString curr = front;
for(int i = 0; i < original.length(); i++){
curr.data = original.charAt(i);
curr = curr.next;
length++;
}
}
第一次迭代时,您将curr.data
设置为原始字符串中的第一个字符。然后,将curr
设置为 curr.next
处的值 - 即 null。
因此,第二次迭代,当您尝试访问 curr.data
时,curr 为 null,因此将引发异常。
您需要考虑到在字符串的第一个字符上,您尚未设置front
,因此接下来设置还为时过早。更改代码以检查第一个元素,在这种情况下不要设置下一个元素:
public LString(String original){
LString curr = null;
for(int i = 0; i < original.length(); i++){
char ch = original.charAt(i);
if(i == 0){
front = new LString(ch);
curr = front;
}
else{
curr.next = new LString(ch);
curr = curr.next;
}
length++;
}
}