1

尝试编写一个程序,让用户输入他们一周的开支。问题在于我希望程序重新询问用户是否输入了不可接受的输入。我想出了如何检测负值,但是当试图捕获输入不匹配异常时(如果输入了一个字符或字符串),循环只是无限运行,询问“星期一费用:”我如何做到这一点,以便给用户另一个回答的机会?我试着休息一下;但这也打破了 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()不会消耗double您的Scanner. 你需要类似的东西,

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

这是因为当扫描器无法解析双精度值时,它总是会进入 catch 块。适合你的情况

mon<0

它总是得到-1值,它会导致无限循环,你可能把你的条件误认为是

while(mon>0)
于 2015-10-07T02:05:52.867 回答
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 回答
0

代替

mon = myScanner.nextDouble(); 

有以下

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

你可以试试下面的代码。它将通过整个阵列。您可以根据需要添加更多验证。

import java.util.Scanner;
public class BarGraph 
{

public static void main(String[] args)
{
    System.out.println("Welcome to Expenses Program: " + "\n");

    week(); 
}

public static void week()
{
    Scanner myScanner;
    myScanner = new Scanner(System.in);
    String [] day = new String[] {"mon", "tues", "wed", "thurs", "fri", "sat", "sun"};

        for (String days : day)
        {
            System.out.println("Expenses for " + days + ":");
            float exp = myScanner.nextFloat();

        }   
}
}
于 2015-10-07T02:36:49.333 回答