2012-10-23 51 views
2

我想了解爲什麼validateItemquantity方法最終會崩潰,出現NumberFormatException錯誤。邏輯似乎是正確的,但有些不對。它假設一直要求用戶重新輸入,直到它獲得有效輸入,然後返回該有效輸入。在java中調用自身的驗證方法

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

看來validItemquantity要麼是null(或)String,這會導致NumberFormatException。 – kosa

+0

嘗試'Integer.parseInt(itemQuantity.trim())'; –

+0

這不是循環輸入的正確方法。使用帶有條件中斷的while(true)循環。 (這可能是也可能不是引起你的異常的問題,但它是*問題。) – jrajav

回答

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

它會循環,直到它耗盡堆棧,至少。 :P這不是一個大問題,它只是感覺像你固定和拋光方形車輪。 – jrajav

+0

如果用戶輸入錯誤的輸入足夠時間導致StackOverflowException,那麼他們要麼是無能,要麼試圖破解你的程序。 – asteri

+0

這是最佳做法還是使用while(true)循環會更好? – Adesh

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"); 
    } 
} 
+0

您稱之爲簡單?它有一個無限循環**和**遞歸! 'itemQuantity = ...'這一行是死碼。它也將無法編譯,因爲該方法並不總是返回一個值。 –

0

問題是你正在改變引用。 itemQuantity在每個「catch」塊中分配一個不同的引用。引用的改變不會更新傳遞給函數的參數。這基本上是一個「傳遞值」的錯誤。

0

您的方法validateItemQuantity返回傳入的原始字符串(如果有效),或者從catch-block(無條件)首次顯示輸入框獲取的字符串。所有的遞歸調用和所有的輸入框都被浪費了。