null和outofbounds异常

时间:2014-04-08 04:12:30

标签: java arrays exception methods wav

我有一个读取样本数组的声音类。它使用WavIO类来执行此操作。如果WavIO.read()返回null,我希望它什么都不做。我该怎么办?不确定它是set或get方法还是两者兼而有之。另外,我收到了这两个错误:

symptom: java.lang.ArrayIndexOutOfBoundsException: 7
at Sound.shorten(Sound.java:69)

symptom: java.lang.ArrayIndexOutOfBoundsException: 3
at Sound.lengthen(Sound.java:51)


public class Sound {   
private String fileName;
private double [] samples; 
public Sound(){
    this.samples = new double[0];
}

public Sound(Sound pSound){
    double[] temp;
    temp = new double[pSound.samples.length];
    for(int i = 0; i < temp.length; i++){
        temp[i] = pSound.samples[i];
    }
    this.samples = temp;
}

public double[] get(){
    return samples;
}

public void increaseVol(double percent){
    // percent = percent/100.0;
    for(int i = 0; i<samples.length;i++){
        samples[i] = samples[i] * (1.0 + percent);
    }
}

public void reduceVol(double percent){
    //percent = percent/100.0;
    for(int i = 0; i<samples.length;i++){
        samples[i] = samples[i] * (1.0 - percent);
    }
}

public void lengthen(){ 
    double[]t = new double[samples.length];

    for(int i = 0;i<samples.length;i++){
        t[i] = samples[i];
    }
    samples = new double[t.length*2];
    for(int i = 0; i < samples.length;i++){
        samples[(2*i)] = t[i];
        samples[(2*i)+1] = t[i];
    } 
}

public void shorten(){
    double[]t = new double[samples.length];
    for(int i = 0; i < samples.length;i++){
        t[i] = samples[i];
    }
    samples = new double[t.length/2];
    if(samples.length % 2 == 0){
        for(int i = 0; i <samples.length;i++){
            samples[i] = t[2*i];
        }
    }
    else{
        for(int i = 0; i <samples.length+1;i++){
            samples[i] = t[(2*i)+1];
        }
    }
}

public void reverse(){
    for(int i = 0; i<samples.length; i++){
        samples[i] = samples[(samples.length)-1-i];
    }
}

public void set(double[] mySamples){
    if (mySamples == null) {
        throw new IllegalArgumentException("null");
    } else {
        samples = new double[mySamples.length];
        for (int i = 0; i < mySamples.length; i++) {
            samples[i] = mySamples[i];
        }
    }
}    

public void wavRead(String fileName){
    this.samples = WavIO.read(fileName);

}

public void wavSave(String fileName){
    WavIO.write(fileName,samples);
}
}

1 个答案:

答案 0 :(得分:1)

对于您提到的第二个ArrayOutOfBounds异常,

在你的lengthen方法中,你有这个循环:

samples = new double[t.length*2];
for(int i = 0; i < samples.length;i++){
    samples[(2*i)] = t[i];
    samples[(2*i)+1] = t[i];
} 

循环应该是:

samples = new double[t.length*2];
for(int i = 0; i < samples.length;i++){
    samples[i] = t[i/2];
} 

您已经将samples的长度加倍,但您的循环长度为samples。加倍它会使i几乎是接近循环结束时样本长度的两倍。

对于您的其他ArrayIndexOutOfBounds异常,您可以使用shorten方法:

else{
    for(int i = 0; i <samples.length+1;i++){  // remove +1
        samples[i] = t[(2*i)+1];              // remove +1
    }
}

在这种情况下,您已将samples数组的大小减半,并且使用t数组中的元素填充它,仅使用每一个元素。您可以删除+1,因为这会导致代码尝试执行超出数组长度的操作。

else{
    for(int i = 0; i <samples.length;i++){    
        samples[i] = t[2*i];                   
    }
}

实际上,您的整个shorten方法可以缩短:

 public void shorten(){
    double[]t = new double[samples.length];

    for(int i = 0; i < samples.length;i++){
        t[i] = samples[i];
    }
    samples = new double[t.length/2];

    for(int i = 0; i <samples.length;i++){
        samples[i] = t[2*i];
    }
}