Java - отлов нескольких исключений и определение возникшего исключения

У меня были некоторые трудности с названием, я не был уверен, как сказать это более точно.

У меня есть эта проблема, у меня есть несколько методов, которые просят пользователя 3 Double входы. Для каждого ввода он проверяет, является ли он действительным (например, если это положительное значение), если это не так, он бросает IllegalArgumentException, Теперь я создал класс Tester для проверки правильности работы методов. Он должен перехватывать исключение, генерируемое методами, и повторно запрашивать у пользователя ввод, вызвавший это конкретное исключение.

Все 3 метода броска и IllegalArgumentException но сообщение об ошибке отличается для каждого. Есть ли в любом случае (при отлове исключения), чтобы увидеть, какие входные данные вызывают ошибку? Вот пример моего кода:

public class account
{
   double value;
   public account(double initialValue)
   {
      if (initialValue < 0)
      {
         throw new IllegalArgumentException("Initial value cannot be negative.");
      }
      value = initialValue;
   }
   public add(double addValue)
   {
      if (addValue < 0)
      {
         throw new IllegalArgumentException("Added value cannot be negative.");
      }
      value = value + addValue;
   }
}

и класс тестера будет что-то вроде:

public class accountTester
{
   public static void main(String[] args)
   {
      try
      {
         double initialValue = Double.parseDouble(JOptionPane.showInputDialog("Enter initial value"));
         account acc = new account(initialValue);

         double addValue = Double.parseDouble(JOptionPane.showInputDialog("Enter value to add"));
         acc.add(addValue);
      } catch (Exception e) {
         System.out.println("Wrong ammount");
         initialValue = Double.parseDouble(JOptionPane.showInputDialog("Re-enter ammount"));
    }
}

Так что я должен изменить в классе тестера, чтобы бросить этот код, только если IllegalArgumentException "Начальное значение не может быть отрицательным."

Извините, если я сделал это трудно понять.

РЕДАКТИРОВАТЬ: По словам моего профессора, мы должны использовать до

String error = e.toString;
if (error.contains("Added value cannot be negative.")
{
    //DO CODE FOR FIRST ERROR
}

Я знаю, что это не самый правильный способ сделать это, хотя.

3 ответа

Поскольку вы не можете соответствовать Strings Как и в случае с функциональным языком, вы должны предоставить три различных типа объектов, если вы хотите различать их с помощью механизма try-catch.

Или с упрощенным подходом прикрепите параметр к исключению, чтобы вы могли использовать только catch пункт, но вы могли бы вести себя по-другому. Что-то вроде

class MyIllegalArgumentException extends IllegalArgumentException {
  public int whichParameter;

  public MyIllegalArgumentException(String string, int which) {
    super(string);
    whichParameter = which;
  }
}

Теперь вы можете:

catch (MyIllegalArgumentException e) {
  if (e.whichParameter == 0)
    ..
  else if (e.whichParameter == 1)
    ..
}

Вы также можете проверить строку на равенство, но это не очень хороший выбор дизайна, вы также можете иметь много блоков try-catch, но это не всегда возможно.

После расширения вашего кода решение легко:

public static void main(String[] args) {
  try {
    double initialValue = ...
    account acc = new account(initialValue);
   } catch (IllegalArgumentException e) {
     ...
   }

   try {    
     double addValue = ...
     acc.add(addValue);
   } catch (Exception e) {
         System.out.println("Wrong ammount");
         initialValue = Double.parseDouble(JOptionPane.showInputDialog("Re-enter ammount"));
   }
 }

Окружить каждый вызов метода собственным блоком try/catch?

В вашем блоке catch вы должны ловить только IllegalArgumentException. Тогда то, что вы можете сделать, это вызвать getMessage() функция, которая позволит вам сделать очень простой вызов String.equals.

Другие вопросы по тегам