将数字添加到范围中



我正在制作一个程序,可以将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循环失败,并且从未实际打印任何数据。

我建议完全去掉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
}

您可能需要查看现有的链表实现,以更好地了解它们通常是如何编写的。

相关内容

  • 没有找到相关文章