3

我有一段代码可以扫描大量数字(作为整数)并将它们存储到场景对象中。然而,在我到达第 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 而不是当前接受数字的迂回方式,但我将添加一些需要以这种方式处理的额外功能。

4

3 回答 3

6

你已经“用完了” ret。

在这部分代码中,您创建的第一个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()thenret[j]将为空,因此.correct不能调用它

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

在调试器中单步执行将(希望)确认这一点

于 2013-09-18T14:57:24.540 回答
1

堆栈跟踪告诉您异常被抛出

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

所以ret, ret[j]orin2scan为空。

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

于 2013-09-18T14:53:47.570 回答
1

i<16应该是i < input.length。由于`split(.., 16) 只指定了一个最大值。

于 2013-09-18T14:58:14.157 回答