将数字添加到范围

时间:2015-12-18 21:47:40

标签: java linked-list

我正在创建一个程序,我可以在其中添加一个整数序列到一个范围。我在将此值添加到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("");
    }

}

1 个答案:

答案 0 :(得分:1)

您已将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,以便更好地了解它们的正常编写方式。

相关问题