我有以下代码,它应该通过将元素复制到新数组并同时擦除每个数组来缩短数组。但是,我仍然保持一个空指针异常错误。
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;
}
答案 0 :(得分: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
变量,只有一行范围(隐藏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循环检查需要i < temp.length
,而不是<=
,因为在后一种情况下它也将运行i = temp.length
的循环,因此尝试编写{ {1}},并且,由于0索引,此索引超出范围。
答案 1 :(得分:1)
除了Null Pointer之外,这是另一个错误。
i<= temp.length
应为i< temp.length
。 length
给出总长度,因为元素计数从0开始,数组的最后一个元素是length-1
答案 2 :(得分: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;
}