0

要素を新しい配列にコピーし、1 つおきにスキップすることで配列を短縮する次のコードがあります。ただし、ヌルポインター例外エラーが発生し続けます。

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];
}

スコープが1行だけの変数を定義します(それらの行のクラス変数(私はあなたが持っていると思います)をtemp隠し、変更せずに残します)。temp

関数が呼び出されたときにクラスtemp変数があった場合は、これらの行の後にあります。代わりに次のようなものが必要です:nullnull

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<=後者の場合、for ループも実行さi = temp.lengthれ、したがって を書き込もうとするtemp[temp.length]ためです。また、インデックスが 0 であるため、このインデックスは範囲外です。

于 2013-04-14T12:35:41.990 に答える
1

Null Pointer とは別に、別のエラーがあります。

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 に答える