我正在编写一个程序,可以在其中将Integer序列添加到Range中。我在将此值添加到Range时遇到问题。它应运行方法addNodeAfter
,但不执行任何操作。
然后,当我想显示范围时,在此行中得到一个NullPointerException
:
for (int i = 1; i <= manyNodes; i++){
有小费吗?
主要:
public class PDEMain {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("Enter a start number: ");
Integer startNum = input.nextInt();
System.out.print("Enter end number: ");
Integer endNum = input.nextInt();
System.out.print("Enter increment: ");
Integer increment = input.nextInt();
Range obj = new Range(startNum, endNum, increment);
System.out.println(obj);
obj.display();
}
}
范围:
public class Range implements Cloneable {
private Integer data; // holds the data
private Range link; //holds the link
Range head; //refers to head of linked list
private Integer manyNodes;
private Integer startValue;
private Integer endValue;
private Scanner input;
public Range(Integer data, Range link){
this.data = data;
this.link = link;
}
public Range(Integer data, Range link, Range head) {
this.data = data;
this.link = link;
this.head = head;
manyNodes++;
}
public Range(Integer start, Integer end,Integer increment){
if(start == null){
startValue = 0;
}
if(increment == null){
if(start < end){
increment++;
}else{
increment--;
}
}
for (int i = start; i <= end; i+= increment){
addNodeAfter(i);
System.out.println(i);
}
}
public Integer getData() {
return data;
}
public void setData(Integer data) {
this.data = data;
}
public Range getLink() {
return link;
}
public void setLink(Range link) {
this.link = link;
}
public Range getHead() {
return head;
}
public void setHead(Range head) {
this.head = head;
}
public void addNodeAfter(Integer element){
this.link = new Range(element, this.link);
}
public void display(){
Range cursor = head;
for (int i = 1; i <= manyNodes; i++){ // NPE on this line
System.out.print(cursor.getData() + " ");
cursor = cursor.getLink();
}
System.out.println("");
}
}
最佳答案
您已将manyNodes
定义为Integer
,而不是int
。这意味着其默认值是null
,而不是0
,并且您永远不会在代码中的任何位置设置该值。
当您尝试循环使用它作为display()
方法中的控制变量时,当JVM尝试取消对null
的装箱操作时,它将抛出NPE。
一个快速的解决方法是将类型更改为int
:
private int manyNodes;
这将解决立即的NPE,但仍然不会显示任何内容,因为您从未真正在调用的构造函数中增加
manyNodes
。这意味着display()
方法中的for循环会失败,并且从不实际打印任何数据。我建议完全放弃
head
和manyNodes
,并按照以下方式重新编写display()
方法:public void display() {
Range cursor = getLink();
while (cursor != null) {
System.out.print(cursor.getData() + " ");
cursor = cursor.getLink();
}
System.out.println("");
}
请注意,由于您在此构造函数中添加内容的方式,这将“向后”输出数据:
public static void main(String[] args) throws Exception {
Range obj = new Range(1, 10, 1);
obj.display(); // prints 10 9 8 7 6 5 4 3 2 1
}
您可能想看一下existing linked-list implementation,以更好地了解它们的正常编写方式。