带有类数组的空指针异常

时间:2013-10-24 14:29:32

标签: java arrays nullpointerexception

我一直在用我的班级获得Null Pointer Exception。

客户类:

public static void main(String[] args) {
    Scanner kb = new Scanner(System.in);
    int count = 0;

    for (int i = 0; i < 100; i++){

        count ++;
        System.out.println(i);
        Clip[] newClip = new Clip[100];
        newClip[i] = new Clip();
        menu();
        int option = kb.nextInt();

        switch(option){
            case 1: System.exit(0);
                    break;

            case 2: newClip[i].Input();
                    newClip[i].Output();
                    break;

            case 3: int indexclip = 0;
                    int testclip = 0;
                    Scanner key = new Scanner(System.in);
                    System.out.println("Enter the index number of the clip: ");
                    testclip = key.nextInt();

                    for (int j = 0; j < 100; j++){

                        indexclip = newClip[j].getIndex(); // happens here
                        System.out.println(indexclip);
                        if(testclip == indexclip){
                            j = 120;
                            newClip[j].Output(); // and i would assume here too
                        }
                    }
                    break;
        }
    }
}

剪辑类:

import java.util.*;

public class Clip {

private int index;
private String surname;        
private float length;
private float speed;
private String time = "testing";

public Clip(){
    index = 0;
    surname = "N/A";
    length = (float) 0.00;
    speed = (float) 0.00;
    time = "0:00AM";        
}

public void Output(){
    System.out.println("Index: "+ index);
    System.out.println("Surname: " + surname);
    System.out.println("Length: " + length);
    System.out.println("Speed: "+ speed + "m/s");
    System.out.println("Time: "+ time);


}
public void Input(){
    int testint;
    float testfloat;
    int spacePos;
    String testString;

    Scanner kb = new Scanner(System.in);
    Scanner key = new Scanner(System.in);

    System.out.println("Input an index number between 1 - 10000: ");
    testint = kb.nextInt();
    for (int i = 0; i < 100; i++){
        if (testint < 1 || testint > 10000){

            System.out.println("Input an index number between 1 - 10000: ");
            testint = kb.nextInt();

           }

        else {
            i = 120;
        }
    }
    index = testint;

    System.out.println("What is the competitor's Surname and their Given name: ");
    surname = key.nextLine();

    System.out.println("Length of the Tape in seconds: ");
    testfloat = kb.nextFloat();
    for (int i = 0; i < 100; i++){
        if (testfloat < 1 || testfloat > 60){

            System.out.println("Length of the Tape in seconds: ");
            testfloat = kb.nextFloat();

           }
        else {
            i = 120;
        }
    }
    length = testfloat;

    System.out.println("Estimated Speed of competitor in metres per second: ");
    testfloat = kb.nextFloat();
    for (int i = 0; i < 100; i++){
        if (testfloat < 7 && testfloat > 13){

            System.out.println("Estimated Speed of competitor in metres per second: ");
            testfloat = kb.nextInt();

           }
        else {
            i = 120;
        }
    }
    speed = testfloat;

    System.out.println("Time of recording between 0900 - 1700: ");
    testString = key.nextLine();

    for (int i = 0; i < 100; i++){
        if (testString.length() != 4){
            System.out.println("Time of recording between 09:00 - 17:00: ");
            testString = key.nextLine();
        }
        else {
            i = 120;
        }
    }
    time = testString;
}

public int getIndex(){
    return index;
}

public String getSurname(){
    return surname;
}

public float getLength(){
    return length;
}

public float getSpeed(){
    return speed;
}

public String getTime(){
    return time;
}

我知道Clip类必须初始化并且我已经完成了,并且我首先运行选项2,以便不使用其他类的构造函数。我只是想让它读取索引号并扫描剪辑数组以获得匹配的索引号

任何帮助都会有助于消磨时间

欢呼声

3 个答案:

答案 0 :(得分:4)

您需要将数组的声明移到第一个for循环之外。

Clip[] newClip = new Clip[100];
for (int i = 0; i < 100; i++){
 /**/
}

因为当你处于switch语句的情况3时,你循环遍历数组Clip的所有元素(但是因为你只设置了数组的一个元素,所以99个元素数组实际上设置为null)。

答案 1 :(得分:1)

问题是你在循环中每次迭代都要创建数组,因此只有当前条目(i)不是null

要解决此问题,请移动以下行:

Clip[] newClip = new Clip[100];

需要在循环之外(for语句之前)。

此外,在int j的循环中,这仅适用于i == 100。不确定这是否有保证。否则,在i之后的newClip中的条目也将是null

答案 2 :(得分:0)

NPE在这里:

Clip[] newClip = new Clip[100];

您需要从循环中获取该行。