Java - отлов нескольких исключений и определение возникшего исключения - PullRequest
0 голосов
/ 03 марта 2012

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

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

Все 3 метода throw и 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 равно «Начальное значение не может быть отрицательным.»

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 03 марта 2012

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

Или с упрощенным подходом добавьте параметр к исключению, чтобы вы могли использовать только предложение 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"));
   }
 }
0 голосов
/ 03 марта 2012

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

0 голосов
/ 03 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...