这是为什么当循环无限运行时呢?
问题描述:
试图编写一个程序,用户在该程序中输入一周的费用。 麻烦来了,我希望程序重新询问用户是否输入了不可接受的输入。我想出了如何检测负值,但是当试图捕捉输入不匹配异常(如果输入字符或字符串时),该循环无限期地运行“星期一费用:” 如何使其成为用户给了另一个机会来回答?我试了一下,但是,这也爆发了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);
}
}
感谢您的帮助
答
你可以使用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();
}
}
}
Scanner myScanner = new Scanner(System.in);将使您的生活比扫描仪myScanner更容易; myScanner = //等等等等等等 –