PDA

View Full Version : [Java] Errore uso scanner


v1sc3rr4k
06-04-2011, 18:44
Allora ragazzi ho un problema che ho risolto nella pratica ma senza capirne il significato.

Ho creato una classe e implementato più metodi, se creo un oggetto Scanner all'interno di un metodo e alla fine del metodo lo chiudo, quando richiamo un altro metodo che usa Scanner mi da errore, più precisamente:



Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextDouble(Unknown Source)
at Matrix.riempimento(Matrix.java:38)
at Main.main(Main.java:8)


Se invece non chiudo in nessun metodo gli Scanner allora funziona tutto.
Perchè?

wingman87
06-04-2011, 19:11
Dall'eccezione mi sembra di capire che chiami nextDouble() ma nello stream di input non c'è nessun Double da leggere, da qui l'eccezione java.util.NoSuchElementException.

Se posti il codice forse posso dirti di più.

banryu79
07-04-2011, 08:25
Ho creato una classe e implementato più metodi, se creo un oggetto Scanner all'interno di un metodo e alla fine del metodo lo chiudo, quando richiamo un altro metodo che usa Scanner mi da errore...
Se invece non chiudo in nessun metodo gli Scanner allora funziona tutto.
Perchè?

Proprio perchè chiudi lo Scanner... Chiudere lo Scanner significa chiudere lo stream associato ad esso.
Comunque qualcosa non quandra, perchè la documentazione dice che se si invocano delle operazioni di ricerca su uno Scanner chiuso dovrebbe partire una IllegalStateException:

Attempting to perform search operations after a scanner has been closed will result in an IllegalStateException.

v1sc3rr4k
07-04-2011, 08:48
Per fare un esempio del dubbio che ho ti posto il mini codice che ho provato ora e che mi ha dato lo stesso errore


int x,y;

Scanner s=new Scanner(System.in);
System.out.println("Dammi un numero:");
x=s.nextInt();
s.close();
System.out.println("Dammi un numero:");
Scanner s1=new Scanner(System.in);
y=s1.nextInt();
s1.close();
System.out.print(x + y);


Ora se elimino il primo close() funziona tutto altrimenti al secondo inserimento mi da quell'errore..Ora non capisco perchè, visto che ho due Scanner diversi e io ne chiudo solo il primo..

banryu79
07-04-2011, 08:54
Ora se elimino il primo close() funziona tutto altrimenti al secondo inserimento mi da quell'errore..Ora non capisco perchè, visto che ho due Scanner diversi e io ne chiudo solo il primo..
Ecco il perchè:

public void close()

Closes this scanner.

If this scanner has not yet been closed then if its underlying readable also implements the Closeable interface then the readable's close method will be invoked. If this scanner is already closed then invoking this method will have no effect.

Attempting to perform search operations after a scanner has been closed will result in an IllegalStateException.

La parte qui sopra sottolineata implica che quando invochi close sullo Scanner 's' viene invocato close anche sullo stream associato (System.in) poichè esso è un InputStream e di conseguenza è un Closeable.

Quando crei il secondo Scanner 's1' su System.in, beh, System.in è chiuso.
Ergo, se vuoi usare scanner con System.in lo dovrai chiudere solo alla fine del programma o comunque una volta chiuso non lo potrai più usare.

v1sc3rr4k
07-04-2011, 09:00
Grazie mille mi hai tolto questo dubbio :)