Scholieren.com forum

Scholieren.com forum (https://forum.scholieren.com/index.php)
-   Software & Hardware (https://forum.scholieren.com/forumdisplay.php?f=20)
-   -   [Java] Probleempje met een Scanner en een oneindige loop (InputMismatchException). (https://forum.scholieren.com/showthread.php?t=1598238)

Rob 18-06-2007 18:52

[Java] Probleempje met een Scanner en een oneindige loop (InputMismatchException).
 
Ik heb een text-based application voor mijzelf geschreven om wat dingen te managen en deze accepteert in de menu's cijfers als userinput (bv. Optie 1 = quit, optie 2 = save, etc.).
Dat vragen om een getal gebeurt wel vaker, dus heb ik de volgende methode getInt() geschreven:

PHP-code:

    public static int getInt() {
        try {
            
int option s.nextInt();
            return 
option;
        } catch(
InputMismatchException ime) {
            
System.err.println("Error: " ime);
        }
        return 
0;
    } 

Waarbij s dus de instantie van java.util.Scanner(System.in) is. Door s.nextInt() wacht ie braaf tot ik een getal invul.

Werkt allemaal aardig, totdat je iets anders dan een getal invult.
Als ik dat doe, krijg ik:

Citaat:

Maak keuze: Error: java.util.InputMismatchException
En vanaf dat moment loopt ie oneindig. Iemand enig idee?

Klaas B. 18-06-2007 20:42

Citaat:

Rob schreef op 18-06-2007 @ 18:52 :
Ik heb een text-based application voor mijzelf geschreven om wat dingen te managen en deze accepteert in de menu's cijfers als userinput (bv. Optie 1 = quit, optie 2 = save, etc.).
Dat vragen om een getal gebeurt wel vaker, dus heb ik de volgende methode getInt() geschreven:

PHP-code:

    public static int getInt() {
        try {
            
int option s.nextInt();
            return 
option;
        } catch(
InputMismatchException ime) {
            
System.err.println("Error: " ime);
        }
        return 
0;
    } 

Waarbij s dus de instantie van java.util.Scanner(System.in) is. Door s.nextInt() wacht ie braaf tot ik een getal invul.

Werkt allemaal aardig, totdat je iets anders dan een getal invult.
Als ik dat doe, krijg ik:



En vanaf dat moment loopt ie oneindig. Iemand enig idee?

Ja, je moet niet die exception gebruiken, maar de NumberFormatException.

PHP-code:

try{
        
int option s.nextInt();
        return 
option;
        } catch(
InputMismatchException ime) {
            
System.err.println("Error: " ime);
        } catch(
NumberFormatException nfe) {
                                    
System.err.println("Error: " nfe);
        return 
0;
    } 


Klaas B. 18-06-2007 20:47

Hm, sorry, ik bedenk me net dat dat waarschijnlijk niet werkt.

Je kunt natuurlijk ook voor een heel andere manier kiezen, door in plaats van met try/catch met if/else-statements te werken, zodat je zeker weet wat er gebeurt wanneer A of B gebeurt.

12Trix 18-06-2007 21:06

Citaat:

When a scanner throws an InputMismatchException, the scanner will not pass the token that caused the exception, so that it may be retrieved or skipped via some other method.
Zie http://java.sun.com/j2se/1.5.0/docs/...l/Scanner.html

Er wordt dan dus geen integer opgehaald, maar de scanner blijft op dezelfde positie van de stream kijken.

Rob 18-06-2007 22:28

@Klaas: Er wordt geen NFE gegooid (zie error). Vandaar dat die ook niet echt van toepassing is.

Citaat:

12Trix schreef op 18-06-2007 @ 21:06 :
Zie http://java.sun.com/j2se/1.5.0/docs/...l/Scanner.html

Er wordt dan dus geen integer opgehaald, maar de scanner blijft op dezelfde positie van de stream kijken.

De API had ik er al op nageslagen. ;)
Maar het komt er dus op neer dat de scanner eigenlijk niet geflushed wordt van zijn data en daarom nog steeds die string probeert te matchen met de te verwachten input?

12Trix 18-06-2007 23:50

Citaat:

Rob schreef op 18-06-2007 @ 22:28 :
@Klaas: Er wordt geen NFE gegooid (zie error). Vandaar dat die ook niet echt van toepassing is.



De API had ik er al op nageslagen. ;)
Maar het komt er dus op neer dat de scanner eigenlijk niet geflushed wordt van zijn data en daarom nog steeds die string probeert te matchen met de te verwachten input?

Ja, dat stond dus ook in de API. ;)

Rob 19-06-2007 08:10

Citaat:

12Trix schreef op 18-06-2007 @ 23:50 :
Ja, dat stond dus ook in de API. ;)
Niet goed gekeken. :D

Rob 19-06-2007 20:03

Er is vast een nettere manier dan s.next() om dit op te lossen, toch? Want nu gebruik ik als het ware next() om het ongeldige token te skippen en dat lijkt mij niet echt de bedoeling van het verhaal. >.>

12Trix 19-06-2007 22:19

Citaat:

Rob schreef op 19-06-2007 @ 20:03 :
Er is vast een nettere manier dan s.next() om dit op te lossen, toch? Want nu gebruik ik als het ware next() om het ongeldige token te skippen en dat lijkt mij niet echt de bedoeling van het verhaal. >.>
Je kunt ook de read() of readLine() methode van BufferedReader gebruiken.

Rob 19-06-2007 23:29

Ja, da's waar. Maar System.in werkt iets prettiger met een commandline programma. :p

Anyway: soblem prolved. 't Is lelijk, maar er komt later toch een GUI omheen, dus dan boeit 't niet echt. ;) Bedankt voor de hulp. :)

12Trix 20-06-2007 15:21

Citaat:

Rob schreef op 19-06-2007 @ 23:29 :
Ja, da's waar. Maar System.in werkt iets prettiger met een commandline programma. :p

Anyway: soblem prolved. 't Is lelijk, maar er komt later toch een GUI omheen, dus dan boeit 't niet echt. ;) Bedankt voor de hulp. :)

Je kunt System.in gebruiken met BufferedReader. Zie:
http://pages.cs.wisc.edu/~cs302/io/J...html#consoleIN

Geen dank :)


Alle tijden zijn GMT +1. Het is nu 02:00.

Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.