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"));
}
}
В вашем блоке catch вы должны ловить только IllegalArgumentException. Тогда то, что вы можете сделать, это вызвать getMessage()
функция, которая позволит вам сделать очень простой вызов String.equals.