在java中调用自身的验证方法

时间:2012-10-23 17:54:06

标签: java validation try-catch

我试图理解为什么方法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 个答案:

答案 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块(无条件地)首次显示输入框获取的字符串。所有的递归调用和所有输入框都被浪费了。