我正在编写一个程序,可以在其中将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循环会失败,并且从不实际打印任何数据。

我建议完全放弃headmanyNodes,并按照以下方式重新编写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,以更好地了解它们的正常编写方式。

09-30 15:41
查看更多