Scanner schließen, erneute Verwendung

b1ck

Mitglied
Java:
    private static int[] eingabeZahlen(int[] e)
    {
        Scanner leser = new Scanner(System.in);
        for(int i=0; i<e.length; i++)
        {
            System.out.printf("Zahl %d: ", i+1);
            String eingabe = leser.nextLine();
            e[i] = Integer.parseInt(eingabe);
        }

        leser.close();
        return e;
    }
   
    private static int eingabeErgebnis()
    {
        int ergebnis = 0;
        Scanner leser = new Scanner(System.in);
        System.out.printf("Ergebnis: ");
        String eingabe = leser.nextLine();
        ergebnis = Integer.parseInt(eingabe);
       
        leser.close();
        return ergebnis;
    }

Hallo,
und zwar habe ich das Problem, dass nachdem der Scanner einmal geschlossen wurde, sich dieser sich kein weiteres Mal verwenden lässt. Sprich es kommt eine Exception, sobald ich die zweite Methode aufrufe.
Da ich den Scanner hier aber an keiner anderen Stelle als in den Methoden selber schließen kann, sollte ich diesen close()-Befehl nun einfach weglassen oder gibt es eine andere Möglichkeit dies zu bewerkstelligen?
 
Der Scanner kapselt bei dir System.in, darum sollte der Scanner auch nicht geschlossen werden, denn er schließt die darunterliegenden "Quellen" und in deinem Fall eben System.in. System IO sollte aber nur vom System geöffnet und geschlossen werden, daher lässt du einfach das Schließen dieses Scanners aus.
 
Okay, vollständig nachvollziehen kann ich dein Gesagtes zwar nicht, aber ist das "nicht schließen" von Ressourcen eine nicht eher unsaubere Art zu programmieren?
 
Ja schon wenn es nicht gerade um die einzige Möglichkeit geht, von deinem Programm, etwas einzulesen.
Grundregel: System Resourcen nicht schließen (System.in, System.out, System.err). Alles weitere sollte geschlossen werden!
 
Im Grunde sollte immer derjeniege eine Resource schließen, der sie auch aufgemacht hat. Im Falle von System.in, hast du sie aber nicht aufgemacht, daher sollst du sie auch nicht schließen.
 
Habe doch noch eine Möglichkeit gefunden...
Man kann den Scanner leser einfach von der main an die Methoden übergeben, und diesen nach Ausführung dann wiederum in der main schließen, sobald alle Methoden, welche diesen benötigen, durchlaufen wurden.
 
Nein, (hier könnte auch "Hallo" stehen)

das solltest du nicht tun! Wie InfectedBytes schrieb, "sollte immer derjeniege eine Resource schließen, der sie auch aufgemacht hat". Du hast zwar einen Scanner erzeugt
Java:
new Scanner(System.in);
, aber die eigentliche Resource (System.in) hast du nicht aufgemacht. Niemand interessiet sich für deinen Scanner - die interessante Resource ist System.in. Deshalb wäre es schlechter Prorammierstil, den Scanner zu schließen, weil dieser System.in schließt.
 
Zuletzt bearbeitet:
Hallo, (hier könnte Ihre Werbung stehen)

zunächst erstmal danke für die Rückmeldung. Wer hat dann zum einen diese Systemresource überhaupt aufgemacht, wenn nicht der Scanner? Oder sind diese grundsätzlich auf?

Und zum anderen bin ich nicht selber auf diese Idee gekommen, sondern habe in einem Video-Tutorial gesehen, wie dies so von einem Dozent für Informatik angewendet wurde. Alles im Rahmen eines sehr einfachen Rechenspiels. Aber auch in seinen anderen Beispielen, welche keine anderen Methoden außer der main-Methode enthalten, hat dieser stehts den Scanner nach Gebrauch wieder geschlossen. Das hat mich überhaupt erst dazu veranlasst, dieses auch bei einem Programm mit mehren Methoden zu versuchen. Daher meine Verwirrung ^^

Hier nun zu erfahren, das man das eigentlich garnicht so machen sollte, ist auf jedenfall gut zu wissen. Frage mich halt nur, warum das dann in dem Tutorial nicht so vermittelt wird.
 
Zuletzt bearbeitet:
zunächst erstmal danke für die Rückmeldung. Wer hat dann zum einen diese Systemresource überhaupt aufgemacht, wenn nicht der Scanner? Oder sind diese grundsätzlich auf?
Die JVM hat diese Resource bei deinem Programmstart geöffnet und schließt sie auch wieder wenn dein Programm beendet ist.

Hier nun zu erfahren, das man das eigentlich garnicht so machen sollte, ist auf jedenfall gut zu wissen. Frage mich halt nur, warum das dann in dem Tutorial nicht so vermittelt wird.
Einerseits macht jeder Fehler, andererseits sind sehr viele Tutorials (m.M.n. insbesondere solche auch youtube) eben oft von Leuten gemacht die nicht wirklich Experten sind.
 
Einerseits macht jeder Fehler, andererseits sind sehr viele Tutorials (m.M.n. insbesondere solche auch youtube) eben oft von Leuten gemacht die nicht wirklich Experten sind.

dieses video-tutorial ist jedoch ein käuflich erwerbliches (Programmieren lernen mit Java - Rheinwerk Verlag - Thomas Theis), welches sich bisher sehr gut zum lernen geeignet hat (sofern ich das beurteilen kann). habe aber auch noch 1,2 bücher zur hand, "Java lernen mit BlueJ" zum beispiel...

Du könntest System.in wrappen in einen ProxyInputStream. Siehe: https://commons.apache.org/proper/c.../commons/io/input/CloseShieldInputStream.html Wenn du den Scanner unbedingt closen willst. Aber ich stimme auch dem bereits genannten zu, dass dies nicht unbedingt nötig ist und eigentlich unnötiger Aufwand

passt schon, da der allgemeine tenor diesbezüglich eindeutig ist, komme ich durchaus damit klar diesen nicht zu schließen 😀

danke trotzdem für deine antwort, auch an die anderen für eure hilfe 🙂
 
Zuletzt bearbeitet:

Zurück
Oben