2016-07-20 10 views
1

私はStringとして保存された数値(BigDecimalとして保存されている)と通貨(USDまたはCNY)を受け入れるプログラムを持っています。ユーザーdimo414の助けを借りて、私は空白入力と非数値入力を考慮することができました。また、有効な入力が読み取られるまで再試行することもできました。ここで特定のケースに対して `try`ブロックを繰り返す方法は?

はコードです:moneyInputが有効であるとき

public static void main(String[] args) { 
    Scanner input = new Scanner(System.in); 
    System.out.print("Enter the amount of money and specify" 
     + " currency (USD or CNY): "); 
    Boolean invalidInput; // breaks out of do-while loop after successful outcome 

    do { 
     invalidInput = false; 
     try { 
      String line = input.nextLine(); 
      Scanner lineScan = new Scanner(line); 
      BigDecimal moneyInput = lineScan.nextBigDecimal(); 
      String currency = lineScan.next(); 

      if (currency.equals("USD")) { 
       // convert USD to CNY 
      } else if (currency.equals("CNY")) { 
       // convert CNY to USD 
      } else { 
       /* 
       reprompt user for currency, 
       but retain the value of moneyInput; 
       repeat process until valid currency 
       */ 
      } 
     } catch (NoSuchElementException | IllegalStateException e) { 
      // deals with errors: 
      // non-numeric moneyInput or blank input 
     } 
    } while (invalidInput); 
} 

は今、私が扱う問題が発生したんだけど、currencyは、例えば、ではありません100.00 abc。この場合、currencyの値を再入力し、moneyの値を保持するようにユーザーに促したいと思います。

私は同様のDO-whileループcurrencyの入力を求めので、同様のif-elseブロックに継続セクションの周りに使用してみました:

do { 
    String currency = lineScan.next(); 

    if (currency.equals("USD")) { 
     // convert USD to CNY 
    } else if (currency.equals("CNY")) { 
     // convert CNY to USD 
    } else { 
     invalidInput = true; 
     System.out.print("Please enter a valid currency: "); 
     // since invalidInput == true, 
     // jump back up to the top of the do block 
     // reprompt for currency 
    } 
} while (invalidInput); 

しかし、それは例外エラーが表示されてしまうため、この解決策は効果がなかったがメッセージは外側のcatchブロックから来ました。だから、実際にtry-catchブロック内のtry-catchブロック内にdo-whileループを実装する必要がありました。

私はelseブロックで呼び出すことができるreadCurrencyと呼ばれるmain以外の新しい関数を定義しようとしましたが、変数スコープの問題が発生しました。私はまだJavaの初心者ですので、関数を適切に定義して必要な情報を渡す方法がわかりませんでした。

tryブロックの先頭にループバックして、ユーザにの通貨のみを再入力できるようにする他の方法はですか?

フィードバックをお寄せいただきありがとうございます。

+0

はあなたが求めることはできません。それがお役に立てば幸い2つの段階での入力: - が//それが 各「ディール」を求めることができる別の方法になります入力を再入力して対処通貨を挿入 - 量 //量 に対処を挿入何かが必要なもの – SCouto

+0

初めてユーザが '100.00 abc'を挿入した場合、プログラムからユーザに何を聞くのですか? –

+0

@nickzoum 'catch'ブロックからのエラーメッセージが表示され、' else'ブロックに一時的に置かれた印刷メッセージが続きます。その後、ユーザは再入力することができる。ケース(http://imgur.com/a/Z2PRc)のスクリーンショットです。再入力のためには、プログラムは 'money'と' currency'の両方を続ける必要があることに注意してください。 –

答えて

1

入力の検証と処理を混合しています。一度に1つのことを行い、最初に検証してから処理します。ヘルパーを使用したコードモジュール化のほんの少しで、これは簡単になります。あなたがそれらを持っている、としたら

  • ブールisValidAmount(文字列amountString)
  • ブールisValidCurrency(文字列currencyString)

String amountString; 
String currencyString; 
do { 
System.out.println("Please insert a valid amount and currency"); 
String line = input.readLine(); 
String[] values = line.split("\\s"); //split on the space 
amountString = values[0]; 
currencyString = values[1]; 

} 
while (!isValidAmount(amountString)); 
while (!isValidCurrencyString(currencyString) { 
    System.out.println("Amount accepted but unsupported currency. Please input only the correct currency now"); 
    currencyString = input.nextLine(); 
} 

は今、何が必要ヘルパーメソッドです検証を完了したら、実際に処理ロジックを挿入することができます:

BigDecimal amount = BigDecimal.parse(amountString); //this may be the wrong name of the parse function, don't remember but something like that; 
switch(currencyString) { 
    case "USD": //... 
} 

ヘルパーメソッドを自分で記述できますか?彼らは簡単にする必要があります:)

+0

+1をあまりあてにしないと助けになります。あなたの答えは私が物事について考えなければならない順序について正しい方向に導くのを助けました:) –

1

コードを機能させるには再構築が必要でした。

inputオブジェクトは、コンソールから値をフェッチするために使用されます。

currencyの値はループ内でフェッチされます(do-while)。ループ条件は、通貨が「USD」または「CNY」に等しくないことです。これによりループ変数invalidInputが不要になります。ここで

public static void main(String[] args) { 
      try { 
      Scanner input = new Scanner(System.in); 
      System.out.print("Enter the amount of money and specify" 
       + " currency (USD or CNY): "); 

      //Boolean invalidInput; // Not required 
      //String line = input.nextLine(); 
      //Scanner lineScan = new Scanner(line); 

      String currency =null; 

      BigDecimal moneyInput = input.nextBigDecimal(); 

      do{  
       if(currency!=null){ 
        System.out.print("Please enter a valid currency: "); 
       } 
       currency = input.next(); 
      }while(!currency.equals("USD")&&!currency.equals("CNY")); 

      if (currency.equals("USD")) { 
       // convert USD to CNY 
      } else if (currency.equals("CNY")) { 
       // convert CNY to USD 
      } 
      } catch (NoSuchElementException | IllegalStateException e) { 
       // deals with errors: 
       // non-numeric moneyInput or blank input 
      } 
    } 
+1

@AisforAmbition自分のコードを試すことができますか?私たちがそれを静かに処理しているので、どのようにエラーを投げることができるかわかりません... –

+0

私の間違い、私は以前のコメントを削除しました。あなたの助けとフィードバックをありがとう:) –

+0

私は元のコードから保持したいことの一つは、有効な入力が空白の入力の場合に入力されるまで、毎回繰り返しプログラムをユーザーに繰り返しプロンプトをさせることでしたあなたは "有効な通貨を入力してください"とどうしましたか?これは、do-whileループの 'invalidInput'ブール値の元の意図です。私は今、あなたが私に大きな出発点を与えたので、私がこれを再実装できるかどうかを見極めようとしています。 –

0

あなたが行く:

public void main(String[] args){ 
    Scanner input = new Scanner(System.in); 
    String message = "Enter the amount of money and specify currency (USD or CNY)"; 
    System.out.println(message); 
    boolean invalidInput = true; 
    BigDecimal moneyInput = null; 
    String currency = null; 
    do{ 
     try{ 
      String line = input.nextLine(); 
      Scanner lineScan = new Scanner(line); 
      BigDecimal temp = lineScan.nextBigDecimal(); 
      if(temp == null){ 
       if(moneyInput == null){ 
        System.out.println(message); 
        continue; 
       } 
      }else{ 
        moneyInput = temp; 
      } 
      String tempCurrency = lineScan.next().toUpperCase(); 
      if(!temp.isValid()){ 
       if(currency == null){ 
        System.out.println("Reenter currency:"); 
        continue; 
       } 
      }else{ 
       currency = tempCurrency; 
      } 
      if (currency.equals("USD")) { 
       // convert USD to CNY 
      } else { 
       // convert CNY to USD 
      } 
      invalidInput = false; 
     }catch(Exception e){ 
      System.out.println(message); 
      moneyInput = null; 
     } 
    }while(invalidInput); 
} 

ます。また、このメソッドを追加する必要があります。両方の値が有効であり、ユーザーを強制されませんまで

public boolean isValid(String currency){ 
    return currency.equals("USD") || currency.equals("CNY"); 
} 

は、これは上に行くだろう再有効な番号が既に指定されている場合はBigDecimalと入力しますが、通貨が無効になるたびにBigDecimalを変更することができます。

1

私がコメントで示唆したのは、金額と金額の検索を分割することで、それぞれ異なるソリューションとそれぞれのループを開発することができます。私は簡単な例を作った。

Mainメソッド

public static void main(String[] args) { 

    Scanner input = new Scanner(System.in); 

    BigDecimal moneyInput = getMoneyInput(input); 
    String currencyInput = getCurrency(input); 

    System.out.println(moneyInput.toString() + " " + currencyInput); 
} 

GetCurency機能

public static String getCurrency(Scanner input) { 
    System.out.print("Enter the currency: "); 

    String currency = null; 
    boolean invalidInput = true; 
    try { 

     do { 
      String line = input.nextLine(); 
      if ("USD".equals(line) || "CNY".equals(line)) { 
       invalidInput = false; 
       currency = line; 
      } else { 
       System.out.print("Invalid currency, enter it again please"); 
      } 
     } while (invalidInput); 


    } catch (Exception e) { 
     System.out.println(e.getMessage()); 
     System.out.print("Invalid currency, enter it again please"); 

    } 
    return currency; 


} 

GetAmount機能

public static BigDecimal getMoneyInput(Scanner input) { 
    System.out.print("Enter the amount of money without the currency: "); 

    BigDecimal moneyInput = BigDecimal.ZERO; 
    boolean invalidInput = true; 
    try { 

     do { 
      String line = input.nextLine(); 
      moneyInput = new BigDecimal(line); 
      invalidInput = false; 

     } while (invalidInput); 


    } catch (Exception e) { 
     System.out.println(e.getMessage()); 
     System.out.print("Invalid input, enter it again please"); 

    } 
    return moneyInput; 

} 
+0

こんにちは、私は本当にあなたのソリューションが好きです。なぜなら、複数の関数を定義してそれらを一緒に使用する適切な方法を紹介したからです。私が維持したい主な機能は、ユーザーがお金と通貨の両方を一度に入力できるようにすることでした –

関連する問題