У меня есть класс с именем GuitarString
, где два из его методов GuitarString(double frequency)
и GuitarString(double[] init)
инициализируют переменную capacity
определенным значением. Мы должны разместить код исключения в верхней части метода (так как он должен быть наилучшим). Однако в моем методе GuitarString(double[] init)
метод продолжает генерировать исключение, когда я передаю массив, такой как
[0,0, 0,25, 0,5, 0,375]
Переменная емкости должна быть инициализирована значением 4, и исключение не должно создаваться. Вместо этого метод выполняет остальную часть блока только в том случае, если я помещаю строку capacity = init.length;
выше исключения, но это, конечно, нарушает передовой опыт, который мы должны поддерживать в проекте.
import java.util.*;
public class GuitarString {
Queue<Double> rb = new LinkedList<>(); // creating ring buffer
private int capacity;
public static final double ENERGY_DECAY = 0.996;
public GuitarString(double frequency) {
if (frequency <= 0 || capacity < 2) {
throw new IllegalArgumentException();
}
capacity = Math.round((float) (StdAudio.SAMPLE_RATE / frequency));
for (int i = 0; i < capacity; i++) {
rb.add(0.0);
}
}
public GuitarString(double[] init) {
if (capacity < 2) {
throw new IllegalArgumentException();
}
capacity = init.length;
for (int i = 0; i < init.length; i++) {
rb.add(init[i]);
}
}
public void pluck() {
for (int i = 0; i < capacity; i++) {
rb.add(Math.random() - 0.5);
rb.remove();
}
}
public void tic() {
double front = rb.remove();
double secondSample = rb.peek();
rb.add(((front + secondSample) / 2) * ENERGY_DECAY);
}
public double sample() {
return rb.peek();
}
}