0

我有以下代码应该通过将元素复制到新数组并跳过其他数组来缩短数组。但是,我不断收到空指针异常错误。

public void shorten()
{
    // put your code here
    if( samples.length % 2 == 0){
        double [] temp = new double[samples.length / 2];
    }
    else if( samples.length % 2 != 0){
        double [] temp = new double[samples.length / 2 - 1];
    }

    Arrays.fill(temp, 1.0);
    int j = 0;
    for(int i=0; i<= temp.length; i++){
        temp[i] = samples[j];

        j = j + 2;

    }
    samples = temp;
}
4

3 回答 3

3

此代码的每个块:

if( samples.length % 2 == 0){
    double [] temp = new double[samples.length / 2];
}
else if( samples.length % 2 != 0){
    double [] temp = new double[samples.length / 2 - 1];
}

定义了一个temp只有 1 行范围的变量(隐藏这些行的temp类变量(我假设你有)并保持不变)。

如果temp类变量是null在调用函数时,它仍然会null在这些行之后。你需要类似的东西:

if( samples.length % 2 == 0){
    temp = new double[samples.length / 2];
}
else { // samples.length % 2 != 0 is implied, since it's else
    temp = new double[samples.length / 2 + 1]; // corrected -1 to +1
}

我删除了double[]之前temp声明的新变量。

此外,for-loop-check 需要是i < temp.length,而不是<=因为在后一种情况下它也会运行循环 fori = temp.length并因此尝试写入temp[temp.length],并且由于 0 索引,该索引超出范围。

于 2013-04-14T12:35:41.990 回答
1

除了空指针,这里还有另一个错误。

i<= temp.length应该是i< temp.lengthlength给出总长度,因为元素计数从 0 开始,所以数组的最后一个元素是length-1

于 2013-04-14T12:34:34.647 回答
0

试试这个:我在需要的地方更改了你的代码。

public void shorten()
{
    // put your code here
    double [] temp=null; // here I declare temp Array
    if( samples.length % 2 == 0){
        temp = new double[samples.length / 2];
    }
    else if( samples.length % 2 != 0){
         temp = new double[samples.length / 2 - 1];
    }

    Arrays.fill(temp, 1.0);
    int j = 0;
    for(int i=0; i< temp.length; i++){// here I removed "=" because Array index starts from 0 to length-1. 
        temp[i] = samples[j];

        j = j + 2;

    }
    samples = temp;
}
于 2013-04-14T12:37:33.903 回答