Scanner schließen in While-Schleife?

Bitte aktiviere JavaScript!
Hallo zusammen,
ich arbeite gerade an einer einfachen Version eines Roulette-Programms.
Es funktioniert eigentlich einwandfrei, jedoch bekomme ich die Meldung, dass ich die Scanner nicht geschlossen habe, weswegen ich dies gerne ändern würde.
Sobald ich dies jedoch mache erhalte ich folgende Fehlermeldung:
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:862)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
at roulette.main(roulette.java:37)

Der Fehler erscheint bereits bei folgendem Ausschnitt:
Code:
import java.util.Scanner;

public class Test {
   
    public static void main (String[] args) {
       
        //Defining variables
       
        int Guthaben;
   
        //Name gets defined
        System.out.println("Bitte sagen sie mir ihren Spielernamen");
        Scanner scannerName = new Scanner(System.in);
        String Name = scannerName.next();
       
        System.out.print("Willkommen ");
        System.out.print(Name);
        System.out.println("! ");
        System.out.println("");
       
        scannerName.close();
       
        System.out.println("Wie viel Geld wollen sie in Chips investieren?");
        Scanner scannerInvest = new Scanner(System.in);
        Guthaben = scannerInvest.nextInt();
       
        scannerInvest.close();
    }
}
Später im Code sind auch Scanner in While-Schleifen. Sollte ich diese überhaupt schließen wenn man sie nochmal verwenden können muss?

Was mache ich falsch?
Ich bin noch neu in diesem Forum und was Java betrifft. Sollte ich irgendwas falsch gemacht haben: korrigiert mich einfach korrigieren! :)

Liebe Grüße
Leon!
 
Du solltest für System.in nur einen Scanner benutzen und nicht mehrere öffnen, und den Scanner wenn überhaupt erst bei beenden des Programms schießen. Da System.in aber von der JVM verwaltet wird, ist's besser, den offen zu lassen ("nur was man öffnen, schließt man auch")
 
Also die Problematik ist hier relativ einfach in der Dokumentation von Scanner zu finden:
https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#close()

Der Close aufruf schließt auch den zugrunde liegenden "Readable", so dieser Closable implementiert.
System.in ist ein InputStream und InputStream implementiert Closable.

Dein Scanner.close() aufruf schliesst somit System.in und damit ist System.in nicht mehr geöffnet.

Best Practice ist hier, dass man zum einen nur ein Scanner für System.in erzeugt und dann diesen Scanner überall nutzt. Erst am Ende wird der dann geschlossen, ehe die Applikation beendet wird.

Edit: System.out ist ein PrintStream, System.in natürlich ein InputStream. Und die Beschreibung von close() schreibt von readable. System.in ist aber natürlich kein Readable sondern ein InputStream und der Constructor ist daher Scanner(InputStream). Ändert aber nichts am Verhalten: Der zugrunde liegende Stream wird geschlossen.
 
Zuletzt bearbeitet:
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben