2010-01-06 7 views
1

Je suis nouveau sur java et j'ai des problèmes avec l'entrée. Ceci est mon code qui semble obtenir la première entrée comme requis, mais saute ensuite les deux prochains appels de fonction "lus"?Problème d'entrée java simple

Des suggestions?

 // open up standard input 
     BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 

    int battMax, battMin, numNodes=0; 
    System.out.print("Enter minimum battery level:"); 
    try { 
     battMin = br.read(); 
    } catch (IOException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
    System.out.print("Enter maximum battery level:"); 
    try { 
     battMax = br.read(); 
    } catch (IOException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
    System.out.print("Enter number of nodes required:"); 
    try { 
     numNodes = br.read(); 
    } catch (IOException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 

Répondre

3

br.read() lit un caractère. Utilisez Integer.parseInt(br.readLine()) qui lira toute une ligne et la convertira en int.

Aussi, on crée un toutes vos variables locales:

int battMax=0, battMin=0, numNodes=0; 
+3

je suggère * pas * initialiser les variables locales à dummy valeurs.Au lieu de cela, déclarez-les le plus tard possible et utilisez explicitement une valeur par défaut si une exception se produit. –

6

br.read() va lire un seul caractère . En outre, si vous lisez System.in, il est probable que vous ne voyiez quelque chose que lorsque l'utilisateur appuie sur Retour. À ce stade, si vous utilisez Windows, il aura \r et \n à lire (ou seulement \n sous Unix).

Je suppose que vous trouverez les valeurs lues par vos deuxième et troisième appels read() sont \r et \n.

En outre, vous n'obtenez pas réellement les valeurs que vous voulez de toute façon - si quelqu'un entre '1' alors vous obtiendrez une valeur de 49, car c'est la valeur Unicode pour ce caractère. .

Vous devez utiliser readLine() pour lire une ligne à la fois (puis analyser la chaîne avec Integer.parseInt() Sinon, vous pouvez utiliser la classe Scanner - Je ne peux pas dire que je l'ai jamais utilisé moi-même, mais il risquerez .. être utile pour vous

Enfin, il y a beaucoup de répétitions dans ce code - je vous suggère de refactoring en créant une méthode utilitaire par exemple, vous pourriez avoir:

public static int promptUserForInt(String prompt, int defaultValue, 
            BufferedReader reader) 
    throws IOException 
{ 
    while (true) 
    { 
     System.out.print(prompt); 
     try 
     { 
      String line = reader.readLine(); 
      return Integer.parseInt(line); 
     } 
     catch (NumberFormatException e) 
     { 
      // Adjust as appropriate... 
      System.out.println 
       ("Unable to parse input; please enter an integer."); 
     } 
    } 
} 

vous pouvez ensuite utilisez ceci très facilement:

BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 

int battMax = promptUserForInt("Enter minimum battery level:"); 
int battMin = promptUserForInt("Enter maximum battery level:"); 
int numNodes = promptUserForInt("Enter number of nodes required:"); 

Vous pouvez factoriser plus loin en prenant dans un Writer ou BufferedWriter pour afficher l'invite à - de cette façon vous pouvez tester plus facilement.

Enfin, je suggère que vous n'emballez pas chaque bit dans un bloc catch pour IOException; Si vous ne pouvez pas lire l'entrée de la console, je suppose que vous ne voulez pas continuer de toute façon, vous devez donc vous comporter de la même manière si la première entrée génère cette exception ou la deuxième ou la troisième. Soit déclarer que votre méthode lance IOException, ou avoir les trois lignes dans le même bloc try, traitées par le même bloc catch.

0

Si vous utilisez Java 1.5 ou version ultérieure, vous pouvez utiliser le java.util.Scanner

public static getInt(String prompt){ 
    int n = 0; 
    try { 
     System.out.print(prompt); 
     Scanner kb = new Scanner(System.in); 
     n = kb.nextInt(); 
    } 
    catch(Exception ex){ 
     ex.printStackTrace(); 
    } 
    return n; 
} 

Exemple d'utilisation:

int battMax = getInt("Enter minimum battery level:"); 
int battMin = getInt("Enter maximum battery level:"); 
int numNodes = getInt("Enter number of nodes required:"); 
+0

Je pense qu'il peut être utile de souligner que ce n'est pas vraiment une façon de gérer les exceptions ... –