我有一个读取样本数组的声音类。它使用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);
}
}
答案 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];
}
}