Java数组空指针后的3499个元素

时间:2013-09-18 14:50:07

标签: java arrays nullpointerexception max

我有一段代码可以扫描大量数字(作为整数)并将它们存储到场景对象中。然而,在我到达第3499个对象(它打印第3498个J)后,它会以空指针崩溃。我找了一个最大的阵列大小但在互联网上找不到任何东西,除了2 ^ 32-5但是我甚至没有接近那个限制。

        in1scan = new Scanner(in1);
        in2scan = new Scanner(in2);
        scenario[] ret= new scenario[9999];
        int j=0;

        while (in1scan.hasNext()){
            String[] input=(in1scan.next().split(",", 16));
                    ret[j]=new scenario();
            for (int i=0; i<16;i++){

                ret[j].input[i]=Integer.parseInt((input[i]));   
            }
            j++;
        }

        j=0;
        while (in2scan.hasNext()){
            ret[j].correct=Integer.parseInt(in2scan.next()); //here things go wrong
            j++;
            System.out.println(j);
        }

有人知道出了什么问题吗?是的,我知道我可以使用nextInt而不是当前迂回接受数字的方式,但我将添加一些额外的功能,需要以这种方式处理它。

3 个答案:

答案 0 :(得分:6)

你已经“失控”了。

在代码的这一部分中,您可以创建in1scan.size()

的第一个ret元素
    while (in1scan.hasNext()){
        String[] input=(in1scan.next().split(",", 16));
        for (int i=0; i<16;i++){
            ret[j]=new scenario();
            ret[j].input[i]=Integer.parseInt((input[i]));   
        }
        j++;
    }

在这里,您使用in2scan.size()的第一个ret元素。如果in2scan.size() > in1scan.size(),则ret[j]将为空,因此无法调用.correct

    j=0;
    while (in2scan.hasNext()){
        ret[j].correct=Integer.parseInt(in2scan.next()); //here things go wrong
        j++;
        System.out.println(j);
    }

在调试器中单步执行(希望)确认此

答案 1 :(得分:1)

堆栈跟踪告诉您

抛出异常
        ret[j].correct=Integer.parseInt(in2scan.next()); //here things go wrong

因此retret[j]in2scan为空。

要找出它是什么,请为NullPointerException设置一个异常断点,并以调试模式运行该程序。这将在抛出异常时暂停执行,允许您在那时检查程序状态。

答案 2 :(得分:1)

i<16应为i < input.length。由于`split(..,16)仅指定最大值