这是为什么当循环无限运行时呢?

问题描述:

试图编写一个程序,用户在该程序中输入一周的费用。 麻烦来了,我希望程序重新询问用户是否输入了不可接受的输入。我想出了如何检测负值,但是当试图捕捉输入不匹配异常(如果输入字符或字符串时),该循环无限期地运行“星期一费用:” 如何使其成为用户给了另一个机会来回答?我试了一下,但是,这也爆发了do while 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); 

} 
} 

感谢您的帮助

+1

Scanner myScanner = new Scanner(System.in);将使您的生活比扫描仪myScanner更容易; myScanner = //等等等等等等 –

你可以使用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); 
    } 
} 
+0

谢谢,这是最简单的答案 – Clarisa

更换

mon = myScanner.nextDouble(); 

与以下

mon = Double.parseDouble(myScanner.next()); 

这是因为它总是去捕捉阻止当sca内尔不能解析双重价值。 这符合你的条件

mon<0 

都能得到-1值,它会导致无限循环 你可能误会了你的病情到

while(mon>0) 

调用到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"); 
    // ... 
} 

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

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(); 

     } 
} 
}