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は、渡された元の文字列(有効な場合)、またはキャッチブロックからの入力ボックスの最初の表示によって取得された文字列(無条件)のいずれかを返します。すべての再帰呼び出しとそのすべての入力ボックスが無駄になります。

于 2012-10-23T18:07:09.453 に答える