2015-10-07 3 views
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); 

} 
} 

Спасибо за вашу помощь

+1

Сканер myScanner = новый сканер (System.in); сделает вашу жизнь проще, чем сканер myScanner; myScanner = // blah blah blah –

ответ

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); 
    } 
} 
+0

Спасибо, это был самый простой ответ, который сработал – Clarisa

0

Заменить

mon = myScanner.nextDouble(); 

со следующими

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

Это потому, что она всегда идет в улове блокировать, когда sca nner не может разобрать двойное значение. , который соответствует вашему условию

mon<0 

всегда получит значение -1, это вызывает бесконечный цикл вы могли ошибиться свое состояние в

while(mon>0) 
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"); 
    // ... 
} 
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(); 

     } 
} 
} 
Смежные вопросы