2015-10-07 2 views
1

Essayer d'écrire un programme dans lequel l'utilisateur saisit ses dépenses pour la semaine. Le problème vient du fait que je veux que le programme demande à l'utilisateur si une entrée inacceptable est entrée. J'ai découvert comment détecter les valeurs négatives, mais lorsque j'essaie d'attraper une exception d'incompatibilité d'entrée (si un caractère ou une chaîne est entré), la boucle s'exécute à l'infini en demandant "Monday Expenses:" Comment faire pour que l'utilisateur donné une autre chance de répondre? J'ai essayé une pause; mais cela a éclaté de la faire tout en boucle aussi, que je ne veux pas.Pourquoi est-ce que ça marche quand la boucle tourne à l'infini?

Voici mon code à ce jour:

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

} 
} 

Merci pour votre aide

+1

Scanner myScanner = nouveau scanner (System.in); vous rendra la vie plus facile que Scanner myScanner; myScanner = // bla bla bla –

Répondre

1

vous pouvez utiliser myScanner.nextLine(); pour vider tous les caractères inutiles dans le cache avant de commencer la boucle suivante

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

Merci, c'était la réponse la plus simple qui a fonctionné – Clarisa

0

Replace

mon = myScanner.nextDouble(); 

avec suivant

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

C'est parce qu'il va toujours à la prise bloquer quand le sca nner ne peut pas analyser une double valeur. qui correspond à votre état

mon<0 

il toujours obtenir -1 valeur, elle provoque boucle infinie vous aurait confondu votre condition en

while(mon>0) 
2

Cet appel à nextDouble() ne consommera pas une double non de votre Scanner. Vous avez besoin de quelque chose comme,

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

Je vous recommande également d'extraire cette logique dans une méthode. Comme,

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

Ensuite, vous pouvez l'appeler comme

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

Vous pouvez essayer le code ci-dessous. Il ira à travers un tableau entier. Vous pouvez ajouter plus de validation que vous le souhaitez.

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

     } 
} 
}