我试图理解为什么方法validateItemquantity最终会因NumberFormatException
错误而崩溃。逻辑似乎是正确的,但有些事情是不对的。它假设要求用户重新输入,直到获得有效输入,然后返回该有效输入。
String validateItemquantity(String itemQuantity) {
try{
Integer.parseInt(itemQuantity);
}
catch (NumberFormatException e) {
itemQuantity = JOptionPane.showInputDialog
("Invalid item quantiy, please enter a new Value");
validateItemquantity(itemQuantity);
}
return itemQuantity ;
调用它的方法:
private void bnPurchaseActionPerformed(java.awt.event.ActionEvent evt) {
String itemCode, validItemquantity ;
int itemQuantity, itemPrice, itemCost, totalCost ;
validItemquantity = validateItemquantity(itemQuantityinput.getText());
itemQuantity = Integer.parseInt(validItemquantity);
itemCode = itemCodeinput.getText();
itemPrice = catalog.searchCatalog(itemCode);
itemCost = payment.calculateItemcost(itemQuantity,itemPrice);
totalCost = payment.calculateTotalcost(itemCost);
答案 0 :(得分:2)
让它返回解析的结果或在异常时调用自身,如下所示:
String validateItemQuantity(String itemQuantity) {
try {
return Integer.parseInt(itemQuantity); // returns if no exception
} catch (NumberFormatException e) {
return validateItemQuantity(JOptionPane.showInputDialog
("Invalid item quantiy, please enter a new Value"));
}
}
此方法仅返回有效的响应;它会永远循环,直到获得有效的响应。
一些评论提到,上述代码可能会受到用户输入数百万次错误数据并吹嘘堆栈的攻击。我说“让他们”,但如果你真的想让它安全,请使用while循环:
String validateItemQuantity(String itemQuantity) {
while (true) {
try {
return Integer.parseInt(itemQuantity); // returns if no exception
} catch (NumberFormatException e) {
itemQuantity = JOptionPane.showInputDialog(
"Invalid item quantiy, please enter a new Value"));
}
}
}
它添加了一个while
循环,因此代码复杂度略有增加,但只有几行额外代码,而且效率更高,更安全。
答案 1 :(得分:0)
我试图理解为什么方法validateItemquantity最终会因NumberFormatException错误而崩溃。
您需要发布堆栈跟踪以进行调查。更好的是,使用调试器来查看异常的位置。
逻辑似乎正确
这似乎是正确的,但令人费解:)有没有理由你必须使用递归?这样简单的事情怎么样?
String validateItemquantity(String itemQuantity) {
while (true) {
try {
Integer.parseInt(itemQuantity);
return itemQuantity;
}
catch (NumberFormatException e) {
validateItemquantity(itemQuantity);
}
itemQuantity = JOptionPane.showInputDialog
("Invalid item quantity, please enter a new Value");
}
}
答案 2 :(得分:0)
问题在于您正在更改引用。 itemQuantity
在每个“catch”块中分配了不同的引用。该引用更改不会更新传递给函数的参数。它基本上是一个“按值传递”错误。
答案 3 :(得分:0)
您的方法validateItemQuantity
返回传入的原始字符串(如果有效),或者从catch块(无条件地)首次显示输入框获取的字符串。所有的递归调用和所有输入框都被浪费了。