在未立即分配数组大小时获取NullPointerException

时间:2015-02-14 20:05:25

标签: java arrays nullpointerexception

我正在尝试学习Java,我正在编写一个程序,将整数数组拆分为两个子数组,一个包含正值,另一个包含负值。

由于两个子数组的大小无法从一开始就指定(因为这个程序应该适用于任何整数数组),我写了两个方法来计算两个子数组的大小(maxNeg和maxPos)。然后,初始化两个子数组(arrayNegative和arrayPositive),具有两个相应的大小。

问题在于,当我尝试使用arraySorter()填充两个数组时,编译器在arraySorter()方法内的第一次迭代中直接给出了ArrayIndexOutOfBoundsException:0错误。

注1:从一开始就将值分配给maxNeg和maxPos变量时,不会发生此问题。

注意2:我知道这种类型的问题通常是使用ArrayLists来存储正面和负面的,但我的任务要求迫使我只使用数组来做这件事。

public class sortMethod {
public int max; // max = main array length
public int maxNeg; // the length of the final array that will store the
                    // negative integers
public int maxPos; // the length of the final array that will store the
                    // positive integers

public int[] intArray = new int[max];

public int getMaxNeg() {
    for (int i = 0; i < max; i++) {
        if (intArray[i] < 0) {
            maxNeg++;
        }
    }
    return maxNeg;
}

public int getMaxPos() {
    for (int i = 0; i < max; i++) {
        if (intArray[i] >= 0) {
            maxPos++;
        }
    }
    return maxPos;
}
public int[] negativeArray = new int[maxNeg];
public int[] positiveArray = new int[maxPos];
public int negIndex = 0;
public int posIndex = 0;

public void arraySorter() {
    for (int a = 0; a < max; a++) {
        if (intArray[a] < 0) {
            negativeArray[negIndex] = intArray[a];
            negIndex++;
            // System.out.println(negativeArray[0]);
        } else {
            positiveArray[posIndex] = intArray[a];
            posIndex++;
        }
    }
}

public sortMethod(int[] y, int z) {
    this.intArray = y;
    this.max = z;

}

有人可以解释为什么我在使用公式来计算两个子阵列的大小时不断得到NullPointerException,以及为什么在声明它们时将值分配给2个变量时我不会得到错误

这是我创建测试对象的主要方法:

public class ArraySort {

public static void main(String[] args) {
    int[] array = { -12, 23, -22, 0, 43, -545, -4, -55, -43, -12, 0, -999};

    int z = array.length;
    sortMethod arrayTest = new sortMethod(array, z);

    arrayTest.getMaxNeg();
    arrayTest.getMaxPos();
    arrayTest.arraySorter();

}

谢谢,如果我的问题格式不符合网站的标准,请原谅我,这是我的第一个,我会在将来尝试改进。

2 个答案:

答案 0 :(得分:1)

在Java中定义变量和方法的顺序并不重要。一旦创建了类实例(并且在调用构造函数之前),就会创建实例变量(例如,您的negativeArray和positiveArray)。因此,您初始化两个大小为0的数组。

答案 1 :(得分:1)

执行此代码时

public int[] negativeArray = new int[maxNeg];
public int[] positiveArray = new int[maxPos];

maxNegmaxPos等于0,因此有一个超出范围的异常是正常的。

要使其正常工作,您可以直接在方法中初始化数组,以便您的代码成为:

public int[] negativeArray;
public int[] positiveArray;
public int negIndex = 0;
public int posIndex = 0;


public void arraySorter() {
    negativeArray = new int[maxNeg];
    positiveArray = new int[maxPos];
    for (int a = 0; a < max; a++) {
        if (intArray[a] < 0) {
            negativeArray[negIndex] = intArray[a];
            negIndex++;
        } else {
            positiveArray[posIndex] = intArray[a];
            posIndex++;
        }
    }
}

您的代码的另一部分错误是sortMethod的构造函数。您将数组长度赋予最大边界,但最大边界实际上是长度 - 1.因此将this.max = z;更改为this.max = z - 1;

此外,您的算法不对数字进行排序,它只是将正数的负数分开...如果您想对数字数组进行排序,您可以将它简化为一行:

Arrays.sort(array);