2

我试图理解为什么方法 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);
4

4 回答 4

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循环,因此代码复杂度略有增加,但它只是额外的几行代码,并且更高效和安全。

于 2012-10-23T17:58:19.703 回答
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");
    }
}
于 2012-10-23T18:03:15.957 回答
0

问题是您正在更改引用。itemQuantity在每个“catch”块中分配了不同的引用。引用的更改不会更新传递给函数的参数。这基本上是一个“按值传递”错误。

于 2012-10-23T18:03:24.960 回答
0

您的方法validateItemQuantity返回传入的原始字符串(如果有效),或者从 catch 块(无条件地)第一次显示输入框获得的字符串。所有递归调用及其所有输入框都被浪费了。

于 2012-10-23T18:07:09.453 回答