1

ユーザーがその週の費用を入力するプログラムを作成しようとしています。問題は、受け入れられない入力が入力された場合にプログラムにユーザーに再質問させたいという事実にあります。負の値を検出する方法を見つけましたが、入力ミスマッチ例外 (文字または文字列が入力された場合) をキャッチしようとすると、ループが無限に実行され、「Monday Expenses:」を求められます。もう一度答えるチャンスはありますか?私は休憩を試みました。しかし、それはdo whileループからも抜け出しました。これは望ましくありません。

これまでの私のコードは次のとおりです。

  import java.util.Scanner;

  public class BarGraph{
  public static void main (String[] args){

Scanner myScanner;
myScanner = new Scanner(System.in);

double mon, tues, wed, thurs, fri, sat, sun;

do{
    try{
        System.out.print("Expenses for Monday: ");
         mon = myScanner.nextDouble();
    }catch( Exception e){
        mon = -1;
    }
}while(mon<0);

System.out.println(mon);

}
}  

ご協力いただきありがとうございます

4

5 に答える 5

2

へのその呼び出しは、あなたの からnextDouble()の非を消費しません。次のようなものが必要です。doubleScanner

if (myScanner.hasNextDouble()) {
    mon = myScanner.nextDouble();
} else {
    System.out.printf("%s is not a double.%n", myScanner.next());
}

また、そのロジックをメソッドに抽出することをお勧めします。お気に入り、

static double getExpensesForDay(Scanner scanner, String day) {
    while (true) {
        System.out.printf("Expenses for %s: ", day);
        System.out.flush();
        if (scanner.hasNextDouble()) {
            return scanner.nextDouble();
        }
        System.out.printf("%s is not a double.%n", scanner.nextLine());
    }
}

次に、次のように呼び出すことができます

public static void main(String args[]) {
    Scanner myScanner = new Scanner(System.in);
    double mon = getExpensesForDay(myScanner, "Monday");
    double tues = getExpensesForDay(myScanner, "Tuesday");
    double wed = getExpensesForDay(myScanner, "Wednesday");
    double thurs = getExpensesForDay(myScanner, "Thursday");
    double fri = getExpensesForDay(myScanner, "Friday");
    double sat = getExpensesForDay(myScanner, "Saturday");
    double sun = getExpensesForDay(myScanner, "Sunday");
    // ...
}
于 2015-10-07T02:11:14.183 に答える
1

myScanner.nextLine(); を使用できます。次のループを開始する前に、キャッシュ内の不要な文字をすべてダンプする

import java.util.Scanner;

public class BarGraph {

    public static void main(String[] args) {

        Scanner myScanner;
        myScanner = new Scanner(System.in);

        double mon, tues, wed, thurs, fri, sat, sun;

        do {
            try {
                System.out.print("Expenses for Monday: ");
                mon = myScanner.nextDouble();
            } catch (Exception e) {
                mon = -1;
                myScanner.nextLine();
            }
        } while (mon < 0);

        System.out.println(mon);
    }
}
于 2015-10-07T02:13:30.857 に答える
1

これは、スキャナーが double 値を解析できない場合、常に catch ブロックに移動するためです。あなたの条件に合ったもの

mon<0

常に-1の値を取得します。条件を間違えた可能性のある無限ループが発生します

while(mon>0)
于 2015-10-07T02:05:52.867 に答える
0

交換

mon = myScanner.nextDouble(); 

以下で

mon = Double.parseDouble(myScanner.next());
于 2015-10-07T02:05:39.760 に答える