我试图理解为什么 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);
最佳答案
让它返回解析结果或在异常时调用自身,如下所示:
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
循环,代码复杂度略有增加,但只是多了几行代码,更加高效和安全。
关于java - java中调用自身的验证方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13036346/