我正在创建一个程序,我可以在其中添加一个整数序列到一个范围。我在将此值添加到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("");
}
}
答案 0 :(得分:1)
您已将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,以便更好地了解它们的正常编写方式。