Можно ли обновить значение перед выдачей исключения? - PullRequest
0 голосов
/ 23 января 2020

У меня есть класс с именем 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();
   }

}
...