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

标签 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);

最佳答案

让它返回解析结果或在异常时调用自身,如下所示:

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/

相关文章:

java - 使用 Stream.of 绕过 IntelliJ 错误

validation - Spring Boot pre api操作注释

php - 如何捕获此错误 : "Notice: Undefined offset: 0"

javascript - 找不到原始元素时,如何单击另一个元素?

c# - 无法跳出finally block

java - 延迟加载错误 : com. fastxml.jackson.databind.JsonMappingException:未能延迟初始化角色集合

java - 使用 Spark 和 Cassandra Java 驱动程序时检测到 Guava 问题 #1635

JavaFX 8 如何使用零参数执行 lambda 表达式

java - Primefaces - 不显示必填字段的消息,仅突出显示边框

jQuery 验证 : call a function after form validate