我对标题有些困难,不确定如何更准确地说出来。
我遇到了这个问题,我有几种方法要求用户输入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
为“初始值不能为负数”时,我才需要在测试者类中更改以抛出该代码。
很抱歉,如果我难以理解的话。
编辑:根据我的教授,我们应该使用doString error = e.toString;
if (error.contains("Added value cannot be negative.")
{
//DO CODE FOR FIRST ERROR
}
我知道这不是最合适的做法。
答案 0 :(得分:2)
由于您无法像在函数式语言中那样匹配Strings
,因此如果您希望能够使用 try-catch <区分它们,则必须提供三种不同类型的对象。 / em> 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"));
}
}
答案 1 :(得分:0)
使用自己的try / catch块围绕每个方法调用吗?
答案 2 :(得分:0)
在catch块中,您应该只捕获IllegalArgumentException。然后你可以做的是调用getMessage()
函数,这将使你能够进行一个非常简单的String.equals调用。