Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Wenn Du die Instanz nicht ine ine Variable schreibst, dann kannst Du da auch keine Methode aufrufen und das Schließen ist nun einmal auch nur ein close() Aufruf.
Und wenn Du einen Scanner auf System.in erzeugst, dann willst Du diesen NICHT schließen. Das Schließen des Scanners schließt ach den zugrunde liegenden Stream und man schließt nichts, das man nicht "besitzt".
Optionen, die du hast, wären z.B.:
- Du kannst den Scanner auf System.in in eine Konstante einer Klasse packen.
- Du kannst einen Wrapper schreiben oder nutzen, der System.in umschließt und ein Schließen nicht weiter gibt.
Generell wäre der Ansatz aber auch das try with resources, wenn Du in einem Block eine Instanz erzeugst, die AutoClosable implementiert:
Java:
try (Scanner scanner = new Scanner(System.in)) {
// Do something with scanner here
}
Aber noch einmal der Hinweis: Einen Scanner auf System.in schließt man nicht, da System.in sonst geschlossen wird!
Hallo nochmal.
entschuldigen Sie, aber habe es immer noch nicht ganz verstanden. Und vielleicht habe ich meine Frage falsch formuliert. Da ich meine Frage nicht editieren kann kommt diese nochmal umgeschrieben:
Hallo.
Ich hätte nochmal eine Frage die mir keine Ruhe lässt..
Ich habe:
Java:
String name = new java.util.Scanner(System.in).nextLine();
In:
Java:
Java.util.Scanner sc = new java.util.Scanner(System.in);
abgeändert. Warum ist hier nicht wichtig, wollte mich nur selbst testen.
Was ist der Unterschied?
Die erste Zeile steht so im Buch, leider ziemlich früh, kann diese aber nicht mit "close()" schließen.
Die zweite Zeile lässt sich aber mit
Code:
sc.close();
schließen, da eine Instanz von "scanner" geschlossen werden muss. Aber was ist mit Zeile eins? Wie wird diese (intern) geschlossen?
Im Buch steht nur, Zitat:
.... sollte mit "close()" der "Scanner" geschlossen werden, der das "close()" zum closeable weiterleitet. (anm: ab hier betrifft es die erste Zeile) Beim String ist das nicht nötig, und bei "file" schließt der "Scanner" automatisch.
Warum ist es nicht nötig bei "String" diese zu schließen?
In der zweiten Zeile erzeuge ich ja eine "Scanner"-Instanz...
In der ersten aber nicht, dort wird nur der eingegebene Wert (ein String) bei der Eingabe gespeichert.
Aber eine Warnung zu Zeile eins:
Java:
String name = new java.util.Scanner(System.in).nextLine();
"Warning: resource leak <unassigned closeable value> is never close"
Sollte ja beachtet werden.
Bei der ersten Zeile wird nix geschlossen. Das ist auch kein "String" Scanner, sondern ein Scanner auf System.in. Und wie @KonradN schon geschrieben hat, man schließt nix, was man nicht selber aufgemacht hat. Und System.in ist etwas, das wird nicht geschlossen, sondern bleibt über die gesamte Programmlaufzeit offen, weil es die normale Standardeingabe der Konsole ist.
In der Zeile erzeugst Du auch einen Scanner. new Scanner(System.in) erzeugt einen neuen Scanner.
In der ersten Variante speicherst Du aber keine Referenz auf diese Instanz. Statt dessen rufst Du direkt eine Methode darauf auf. Danach bekommst Du das Ergebnis dieser Methode zurück.
Und da wird nichts geschlossen. Da du keine Referenz mehr auf diese Scanner Instanz hast, wird der Garbage Collector diese Instanz irgendwann in der Zukunft aus dem Speicher entfernen.
Und die Scanner Klasse bietet mehrere Konstruktoren. So kannst Du eine Scanner Instanz auf einem InputStream erzeugen. System.in ist ein InputStream.
Statt dessen kannst Du es auch auf einer Datei öffnen. Wenn Du irgendwann die ganze Datei gelesen hast, dann wird die Datei automatisch wieder geschlossen.
Und als letzte Möglichkeit kannst Du einen Scanner direkt auf einem String erzeugen. Da ist dann nichts zu schließen, denn es wird dann direkt der String verarbeitet, der dem Scanner gegeben wurde.