[java] Readline gaat fout

Pagina: 1
Acties:

  • Gummbahla
  • Registratie: Februari 2003
  • Laatst online: 15-05 15:36
Ik heb een stukje code dat als een menu dient te werken.
Een keuze kan gemaakt worden door een getal in te voeren, en af te sluiten met <enter>.
Handmatig werkt dit perfect, maar zodra ik een input file ga gebruiken (java bla < input.txt) gaat het mis. Alleen de eerste regel van de file wordt gelezen, en daarna retourneerd de functie readInputLine() alleen nog maar null's.
Voorbeeld:
Wanneer ik als input file het volgende gebruik:
code:
1
2
1
2

Dan wordt één keer het menu weergegeven omdat de input 0 is.
Hierna echter wordt het menu oneindig vaak weergegeven, omdat er een NumberFormatException ontstaat (een null is dan ook geen int ;)), en na een NFException het menu opnieuw wordt weergegeven.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public void mainMenu(){
        
   System.out.println("1. Menu");
   System.out.println("2. Iets anders");

   String myChoice;
   boolean validInput = false;
    
   while(true){
        
      myChoice = readInputLine();
      int theChoice = 0;
        
      try{
         theChoice = Integer.parseInt(myChoice);
         validInput = true;
      }catch (NumberFormatException e){
         break;
      }
      
      if(validInput)
         switch(theChoice){
    case 1:
       //Show menu
       break;
    case 2: 
       //Quit
       System.exit(0);
       break;
         }
   }
   mainMenu(); 
}
    
public static String readInputLine(){
   try
    {
      BufferedReader fromConsole = new BufferedReader(new InputStreamReader(System.in));
      String message;

      while (true)
      {
         message = fromConsole.readLine();
         return message;
      }
    }
    catch (Exception ex)
    {
         System.out.println("Unexpected error while reading from console!");
    }
    return "0";
}


Kan iemand ontdekken wat er hier fout gaat?

  • nxt
  • Registratie: November 2001
  • Laatst online: 04-02 09:36

nxt

Wat er gebeurt is het volgende:
je leest de input van de console met behulp van een BufferedReader
en zoals je in de API kunt lezen returned de readLine() method de ingevoerde regel, of null indien het einde van de stream is bereikt.
Als je zelf typed in de console is de stream 'oneindig', maar als je een file meegeeft komt er wel een einde aan..
Je zult dus zelf moeten kijken of de gelezen regel null is en dan doen wat je wilt (system.exit of misschien een andere tekst laten zien?)

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Wat je fout doet is niet direct wat nxt zegt, maar wel iets gerelateerds. Je maakt namelijk steeds in je readInputLine() een BufferedReader, maar leest steeds slechts een regel. Als je handmatig typt is dat geen probleem omdat je langzaam genoeg bent, maar met een pipe (foo < file of cmd | foo) gaat alles een stukje sneller waardoor alles zich praktisch in een keer op je stdin bevindt. En die zit nog in die oude BufferedReader.

Je kunt 't voorkomen (getest) door in je main() een BufferedReader uit je System.in halen en die als argument aan je readInputLine() meegeven.

[ Voor 7% gewijzigd door CyBeR op 26-01-2005 01:44 ]

All my posts are provided as-is. They come with NO WARRANTY at all.


  • Gummbahla
  • Registratie: Februari 2003
  • Laatst online: 15-05 15:36
Ahh.. tnx! Ik d8 al dat het iets in die richting zou zijn. Stom dat ik niet zelf tot die oplossing ben gekomen 8)7