我正在制作一个程序,可以将Integer序列添加到Range中。将此值添加到Range时遇到问题。它应该运行方法addNodeAfter
,但它什么也不做。
然后,当我想显示范围时,我会得到一个NullPointerException
,这一行是:
for (int i = 1; i <= manyNodes; i++){
有什么建议吗?
Main:
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
}
您可能需要查看现有的链表实现,以更好地了解它们通常是如何编写的。