使用数组打印时出现空指针异常

时间:2016-05-28 06:32:48

标签: java arrays null-pointer

似乎无法摆脱错误,看看摆脱错误的不同方法,但无法理解。

static Holding[]holding = new Holding[15];

public static void main(String[] args){
    sampleData();   //Sample Data from Assignment

    int options;
    do{ 
        scanner = new Scanner(System.in);

        System.out.println("1. Add Holding");
        System.out.println("7. Print all Holdings");
        System.out.println("13. Exit");

        options = scanner.nextInt();
        switch(options){

        case 1:
            addHolding();
            break;
        case 7:
            printHolding();
            break;

        default:
            System.out.println("Please");
        }

    }while(options != 13);
    System.out.println("I'm out");

}

public static void sampleData(){
    holding[0] = new Book("b000001", "Intro to Java");
    holding[1] = new Book("b000002", "Learning UML");
    holding[2] = new Book("b000003", "Design Patterns");
    holding[3] = new Book("b000004", "Advanced Java");
    holding[4] = new Video("v000001", "Java 1", 4);
    holding[5] = new Video("v000002", "Java 2", 6);
    holding[6] = new Video("v000003", "UML 1", 6);
    holding[7] = new Video("v000004", "UML 2", 4);

}

    public static void printHolding(){
    int option;
    do{
        for(Holding h : holding){   
            h.print();
            System.out.println();
        }

        System.out.println("To exit press '0'");
        option = input.nextInt();
    }while(option != 0);


}

Exception in thread "main" java.lang.NullPointerException
    at s3599741_A2.LibraryMenu.printHolding(LibraryMenu.java:307)
    at s3599741_A2.LibraryMenu.main(LibraryMenu.java:71)

错误是

h.print();

printHolding();
在switch语句中

。 如您所见,该数组由另一个对象构成,如

holding[i] = new Book("Insert ID", "Insert Title");

我写了一个像这样的问题但被标记为重复,我查看了链接

What is a NullPointerException, and how do I fix it?

但是无法找到我遇到的问题,或者我还没有知道这些知识。有人可以解释我应该做什么吗?

Hold的限制必须是15,我不能使用ArrayList或List。

控股班:

public abstract class Holding{

private String holdingId;
private String title;

public Holding(String holdingId, String title){

    this.holdingId = holdingId;
    this.title = title;         
}

public String getId() {

    return holdingId;
}

public String getTitle(){

    return title;
}

public boolean getStatus(){

    return active;  
}   

public void print(){
    System.out.println("ID: " + getId());
    System.out.println("Title: " + getTitle());     
}

}

2 个答案:

答案 0 :(得分:1)

您定义了这样的馆藏数组:

static Holding[] holding = new Holding[15];

持有15个元素。但是,在sampleData()方法中,您只分配了8个元素。然后,在printHolding()中,您调用Holding.print(),其中包含访问每个持有的ID和标题:

public void print(){
    System.out.println("ID: " + getId());
    System.out.println("Title: " + getTitle());     
}

但是这会导致NullPointerException的第9个元素的holding因为你从未定义它。

答案 1 :(得分:1)

您的holding数组开始填充nullsampleData仅将holding(条目0 - 7,包括0和7)的条目中的8个设置为非null值;这意味着条目8 - 14(包括)仍然是null

这意味着此代码将抛出:

for (Holding h : holding) {
    h.print();                 // Here
    System.out.println();
}

要解决此问题,请添加null支票:

for (Holding h : holding) {
    if (h != null) {
        h.print();
        System.out.println();
    }
}

...和/或跟踪您在实例字段中添加了多少Holding(因为您显然不允许为此使用正确的数据结构, List);

static int holdingCount = 0;

...然后sampleData看起来像:

public static void sampleData() {
    addSampleData(new Book("b000001", "Intro to Java"));
    addSampleData(new Book("b000002", "Learning UML"));
    addSampleData(new Book("b000003", "Design Patterns"));
    addSampleData(new Book("b000004", "Advanced Java"));
    addSampleData(new Video("v000001", "Java 1", 4));
    addSampleData(new Video("v000002", "Java 2", 6));
    addSampleData(new Video("v000003", "UML 1", 6));
    addSampleData(new Video("v000004", "UML 2", 4));
}

然后

private static void addSampleData(Holding h) {
    if (holdingCount < holding.length) {
        holding[holdingCount++] = h;
    } else {
        throw new IllegalStateException("Tried to add too many holdings to array");
    }
}

addHolding会做类似的事情。

但同样,这只是因为您已经说过,您不能使用正确的数据结构。

相关问题