Warnung in Eclipse: unassigned closeable value

Sw4rls

Mitglied
Hallo,

ist mein erster Post hier. Ich fange gerade an, mir Java selbst beizubringen. Ich bin also noch ziemlicher Anfänger, aber bringe schon kleine Miniprogrämmchen zustande. Ich benutze Eclipse und bekomme eine Warnung bei folgendem Code:

Java:
public class Circle
{
	
	public static void main(String[] args)
	{
		
		circleArea();
		
	}
	
	public static void circleArea()
	{
		
		System.out.println("Bitte Radius des Kreises angeben:");
		double radius = new java.util.Scanner(System.in).nextDouble();
		System.out.println("Die Flaeche des Kreises betraegt");
		System.out.println(2 * radius * radius * Math.PI);
		
		
	}
}

Die Warnung ist für diese Zeile:
Code:
double radius = new java.util.Scanner(System.in).nextDouble();
und lautet:
- Resource leak: '<unassigned Closeable value>' is never closed

Was habe ich falsch gemacht? Wie muss ich den Code korrigieren, damit die Warnung nicht mehr erscheint?

Danke im Voraus für hilfreiche Antworten.

Sw4rls
 

Fant

Bekanntes Mitglied
Die Meldung besagt einfach, dass du den Scanner besser mit .close() schließen solltest.
Die Warnung kannst du bei deinem kleinen Mini-Programm aber auch ruhig ignorieren,
 

Manello

Aktives Mitglied
Ja, du hast ja recht ... aber wenn jemand gerade mit dem Programmieren anfängt, dann gibt es vermutlich erst mal wichtigeres, dass es zu verstehen gilt.
Es gibt wichtigeres? Na dann, gut Nacht wenn du schon so anfängst, wie werden die großen Programme mal aussehen? Ordnung und Leserlichkeit ist dass wichtigste, und wenn man ganz viele kleine Fehler Ignoriert, kommt am ende auch ein großes Problem raus.
 

Sw4rls

Mitglied
Erst mal danke für die Antworten. Leider werde ich aus den beiden Links nicht direkt schlau. Ich verstehe, dass man den Scanner wieder schließen sollte, wenn er nicht mehr gebraucht wird. Aber wie gebe ich das jetzt syntaktisch an?

Also mein Code sieht jetzt so aus:

Java:
import java.lang.Math;

public class Circle implements AutoCloseable
{
	
	public static void main(String[] args) throws Exception
	{
		
		circleArea();
		
	}
	
	public static void circleArea()
	{
		
		System.out.println("Bitte Radius des Kreises angeben:");
		double radius = new java.util.Scanner(System.in).nextDouble();
		System.out.println("Die Flaeche des Kreises betraegt");
		System.out.println(radius * radius * Math.PI);
		
		
	}

	public void close() throws Exception
	{
		
		System.out.println("Die Fläche des Kreises ist berechnet.");
		
	}
}
(Ja, ich habe die Formel auch gleich verbessert :D)

Ich habe noch nicht ganz verstanden, wie das genau funktioniert. Vielleicht kann mir jemand das möglichst einfach erklären (oder zumindest sagen, was in meinem code noch fehlt).
 

Fant

Bekanntes Mitglied
Damit du den Scanner wieder schließen kannst, musst du ihn zuvor einer Scanner-variablen zuweisen. Etwa so:

Java:
Scanner scanner = new Scanner();
// ( mache was mit dem Scanner)
scanner.close();
 

xehpuk

Top Contributor
Die Warnung sagt nur aus, dass du einen von vielen Eclipse-Bugs entdeckt hast. :D
[JAPI]System#in[/JAPI] sollte man wohl nicht schließen.
 

xehpuk

Top Contributor
Man wird gewarnt, dass man den Scanner nicht geschlossen hat, welcher
Code:
System.in
wrappt.
Allgemein braucht man ihn doch nicht zu schließen, wenn er per [JAPI]Scanner#Scanner(java.io.InputStream)[/JAPI] erzeugt wurde. Dabei wird ja kein neuer Stream geöffnet oder dergleichen. Der unterliegende Stream muss lediglich irgendwann geschlossen werden. Es sei denn, es handelt sich um
Code:
System.in
. Oder habe ich etwas verpasst?
 

Ark

Top Contributor
Oder habe ich etwas verpasst?
Wie man's nimmt. Jedenfalls würfelst du gerade viele verschiedene Sachen durcheinander. ;)

Allgemein braucht man ihn doch nicht zu schließen, wenn er per [JAPI]Scanner#Scanner(java.io.InputStream)[/JAPI] erzeugt wurde. Dabei wird ja kein neuer Stream geöffnet oder dergleichen. Der unterliegende Stream muss lediglich irgendwann geschlossen werden.
Das ist zwar richtig, aber hier gar nicht von Belang. Der Parser orientiert sich nur an AutoCloseable, und da Scanner dieses Interface implementiert, kommt eine entsprechende Warnung. Der Scanner hätte genausogut auch mit [c]new Scanner(new File("foo.txt"))[/c] erzeugt werden können, da würde dein Argument nicht mehr ziehen. ;)

Und außerdem hat das noch nicht einmal was mit Eclipse zu tun. Wie gesagt, es liegt an AutoCloseable beim Scanner, und dafür kann Eclipse nichts.

Es sei denn, es handelt sich um
Code:
System.in
.
Nicht nur. Es hätte auch jeder x-beliebige andere InputStream sein können, der eigentlich nicht geschlossen werden muss. Aber der Parser kann nicht entscheiden, wann es notwendig ist und wann nicht. Das kann man als Entwickler nur der Dokumentation entnehmen. (Und selbst dann wird es wohl kaum falsch sein, den Datenstrom sauber zu schließen.)

Ark
 

xehpuk

Top Contributor
Das ist zwar richtig, aber hier gar nicht von Belang. Der Parser orientiert sich nur an AutoCloseable, und da Scanner dieses Interface implementiert, kommt eine entsprechende Warnung. Der Scanner hätte genausogut auch mit [c]new Scanner(new File("foo.txt"))[/c] erzeugt werden können, da würde dein Argument nicht mehr ziehen. ;)
Und genau das ist das Problem. Das wurde einfach schlecht/fehlerhaft implementiert. Man hätte zwischen den Konstruktoren unterscheiden können.

Und außerdem hat das noch nicht einmal was mit Eclipse zu tun. Wie gesagt, es liegt an AutoCloseable beim Scanner, und dafür kann Eclipse nichts.
Das hat sehr wohl etwas mit Eclipse zu tun. Diese Warnung kommt von Eclipse und seinem Parser, nicht von
Code:
javac
.

Aber der Parser kann nicht entscheiden, wann es notwendig ist und wann nicht.
In diesem Fall wäre es gegangen. In Fällen, in denen das nicht gegangen wäre, hätte er einfach gar nichts sagen sollen. Für mich ist das einfach eine falsche Warnung.
 

Ark

Top Contributor
Und genau das ist das Problem. Das wurde einfach schlecht/fehlerhaft implementiert. Man hätte zwischen den Konstruktoren unterscheiden können.
Hm, und wie genau? Mit Annotations? Mit Interfaces (=jetzige Lösung) stelle ich mir das jedenfalls etwas schwierig vor …

Das hat sehr wohl etwas mit Eclipse zu tun. Diese Warnung kommt von Eclipse und seinem Parser, nicht von
Code:
javac
. … Für mich ist das einfach eine falsche Warnung.
Ich habe mir gerade mal den entsprechenden Abschnitt der Sprachspezifikation durchgelesen, und da fand ich jetzt keinen Hinweis darauf, wie so etwas vom Parser zu behandeln ist. Insofern stimmt es natürlich, dass dieses Verhalten Eclipse-spezifisch ist. Aber es ist, wenn ich das richtig verstanden habe, auch kein fehlerhaftes Verhalten. Wenn es dich stört, kannst du die Warnung abschalten (sollte gehen).

In Fällen, in denen das nicht gegangen wäre, hätte er einfach gar nichts sagen sollen.
Und da ist das Problem: Finde einen Algorithmus, der für alle Java-Quelltexte in endlicher Zeit und mit endlichem Speicher korrekt entscheiden kann, ob "das gegangen wäre" oder nicht.

Ich bin übrigens der Meinung, dass in diesem Fall der Fehler eher in den angebotenen Konstruktoren von Scanner zu suchen ist. Meiner Meinung nach hätte es für jeden Konstruktor nur eine für alle Konstruktoren identische Möglichkeit geben dürfen, die Eingabe festzulegen, und zwar über CharSequence. Dann bräuchte ein Scanner auch kein Closeable, geschweige denn ein AutoCloseable.

Ark
 
Zuletzt bearbeitet:

xehpuk

Top Contributor
Mit Interfaces (=jetzige Lösung) stelle ich mir das jedenfalls etwas schwierig vor …
Hmm, hier wird wohl das Problem sein. Man müsste im Prinzip zwischen echten Ressourcen und Wrappern unterscheiden.
Hierbei ist eigentlich auch nur der "richtige" Stream zu schließen:
Java:
new BufferedInputStream(new FileInputStream("…"));
Am Ende schließt man diesen aber über den Wrapper, weil man in der Regel keine Referenz mehr hat.

Ist in der Tat also nicht leicht zu machen. Ich finde dieses Verhalten jedenfalls problematisch, wenn man keine einzige Warnung im Code haben will. So muss man diese im Allgemeinen hilfreiche Warnung wegen der einen Falschmeldung ausstellen.

Wenn es dich stört, kannst du die Warnung abschalten (sollte gehen).
Ist nicht nötig, weil ich durch die drastische Performanceeinbuße bei Juno umgestiegen bin. NetBeans hat wiederum natürlich auch seine Macken …
 

Sw4rls

Mitglied
Hm, also lautet der Konsens nun, dass ich den ursprünglichen Code also ohne in schlechtem Stil zu schreiben, stehen lassen kann?

Jedenfalls bekomme ich die Warnung, was ich auch versuche, nicht weg. Und da ich nicht Tage damit verbringen will, werde ich erst mal weiter lernen und mich des Problems annehmen, wenn ich später nochmal darauf treffe.

Danke jedenfalls für alle Antworten!
 
H

hüteüberhüte

Gast
Netbeans zeigt übrigens keine Fehlermeldung.

Guter Stil wäre in diesem Fall:

Java:
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Bitte Radius des Kreises angeben:");
        double radius = Double.parseDouble(reader.readLine());
        System.out.println("Die Flaeche des Kreises betraegt: " + radius * radius * Math.PI);

+ throws IOException
 

Sw4rls

Mitglied
Ok, also wenn ich den Code so schreibe:

Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.Math;

public class Circle
{
	
	public static void main(String[] args) throws IOException
	{
		
		circleArea();
		
	}
	
	public static void circleArea() throws IOException
	{
		
	    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
	    System.out.println("Bitte Radius des Kreises angeben:");
	    double radius = Double.parseDouble(reader.readLine());
	    System.out.println("Die Flaeche des Kreises betraegt: " + radius * radius * Math.PI);
		
	}
}

gibt mir Eclipse weder Warnung noch Fehler aus. So werde ich es also lassen. Vielen Dank!
 
H

hüteüberhüte

Gast
"unassigned Closeable value" bedeutet ja etwas wie "Nicht-zugewiesene schließbare Variable wird nicht geschlossen"

Finde die Warnung auch unnötig. IDE s sind eben auch nicht fehlerfrei

Am Besten wärs, du würdest dich nicht weiter um solche Meldungen kümmern und mit OOP weitermachen (eigene Kreis-Klasse schreiben)
 

Sw4rls

Mitglied
Mein Ansinnen ist eigentlich, ein Programm zu schreiben, dass einem Körper ausrechnet und später vielleicht Optimierungsmöglichkeiten aufzeigt.

Also So was wie:

- Diese Zylinderförmige Verpackung hat das und das Volumen.
- Wenn Ich ein bestimmtes Volumen haben möchte, wie sollten Radius und Höhe dann am besten aufgeteilt sein, damit ich möglichst wenig Material brauche?
- Auch anders herum: Wenn ich nur bestimmtes Material zur Verfügung habe, wie forme ich dann den Zylinder um möglichst viel Volumen zu bekommen?

Bis dahin hab ich noch ein bisschen Weg, aber ich denke das sollte machbar sein.
Jetzt wird es aber doch ein bisschen Off-Topic.
 
H

hüteüberhüte

Gast
Mit anderen worten, formel für radius, höhe und volumen ableiten und minimum bestimmen. Radius und höhe stehen ja immer im denselben verhältnis.[/OT]

Gesendet von mit Tapatalk 2
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
paulen1 Best Practice "Unchecked Assignment" Warnung beim erstellen eines 2D Arrays of Arraylists Java Basics - Anfänger-Themen 2
R Warnung: Unable to resolve table 'users' Java Basics - Anfänger-Themen 10
R Warnung, wenn eine Variable eingegeben wird Java Basics - Anfänger-Themen 6
A Deadcode Warnung? Java Basics - Anfänger-Themen 4
Dit_ Compiler-Fehler Stringvariable ändern | Compiler warnung Java Basics - Anfänger-Themen 25
B Warnung : Dead Code. Aber wieso? Java Basics - Anfänger-Themen 10
A Variablen Type safety Warnung beseitigen Java Basics - Anfänger-Themen 3
T Liste Umformen ohne Warnung Java Basics - Anfänger-Themen 4
A Cast ohne Warnung bei Generics Java Basics - Anfänger-Themen 2
M Generics - "Unchecked cast"-Warnung wegbekommen Java Basics - Anfänger-Themen 4
O Warnung zu Generics (Java 1.6) Java Basics - Anfänger-Themen 6
C Unchecked Call? Wie Warnung beseitigen? Java Basics - Anfänger-Themen 3
S "Unchecked Cast" Warnung Java Basics - Anfänger-Themen 3
G Warnung bei abgeleiteter Klasse Java Basics - Anfänger-Themen 2
T Warnung bei LinkedList Java Basics - Anfänger-Themen 8
S nach Import von jars (PLC4x) in Eclipse kann nicht mehr compiliert werden Java Basics - Anfänger-Themen 9
F Fehlermeldung in Eclipse Java Basics - Anfänger-Themen 13
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
R Einfacher Taschenrechner mit Eclipse Java Basics - Anfänger-Themen 3
P Eclipse installieren Java Basics - Anfänger-Themen 5
D Eclipse will nicht auslesen Java Basics - Anfänger-Themen 6
M Von Eclipse zum richtigen Programm Java Basics - Anfänger-Themen 1
K Wie kann ich "enter" von der Console in Eclipse löschen? Java Basics - Anfänger-Themen 2
B von Java/Eclipse verwendete Datei existiert gar nicht? Java Basics - Anfänger-Themen 6
nbergmann Eclipse: Lehrbuch-Programm startet nicht Java Basics - Anfänger-Themen 22
A Eclipse IDE - Wie bekomme ich eine ältere Version Java Basics - Anfänger-Themen 6
nbergmann Eclipse: Lehrbuch-Programm startet nicht Java Basics - Anfänger-Themen 7
C externe jar einbinden in Eclipse-Projekt Java Basics - Anfänger-Themen 2
F Falscher Link zum Path? Unterschiedliche Antworten bei Eclipse und VisualStudiocode Java Basics - Anfänger-Themen 5
berserkerdq2 Wie gebe ich den Pfad zu einer Datei an, die in einem Ordner in Eclipse ist? Java Basics - Anfänger-Themen 1
nbergmann eclipse schon mit "HalloWelt" unverständlich. Java Basics - Anfänger-Themen 4
G Zeilenumbrüche in Eclipse Java Basics - Anfänger-Themen 1
M Eclipse kennt keine String Klasse mehr Java Basics - Anfänger-Themen 1
brypa Eclipse installieren Java Basics - Anfänger-Themen 31
R Methoden Eclipse schlägt mir nicht alle Möglichkeiten vor Java Basics - Anfänger-Themen 4
P Eclipse Karate Framework API Test . Unexpected Error: the trustAnchors parameter must be non-empty Java Basics - Anfänger-Themen 1
P Apache Derby wird in Eclipse trotz Anbindung nicht gefunden Java Basics - Anfänger-Themen 6
thor_norsk Eclipse Symbole Java Basics - Anfänger-Themen 2
N Eclipse Programm normal ausführen Java Basics - Anfänger-Themen 1
lougoldi Intellij oder Eclipse Java Basics - Anfänger-Themen 7
R Eclipse Aufgabe Java Basics - Anfänger-Themen 4
B tar.gz in Eclipse als Bibliothek einbinden Java Basics - Anfänger-Themen 3
Mr.Strobel BufferedImage Exportieren Eclipse Java Basics - Anfänger-Themen 14
D wie kann man in Pong mit eclipse den schläger bewegen Java Basics - Anfänger-Themen 1
Avalon Request direkt aus Eclipse wie bei Postman Java Basics - Anfänger-Themen 3
H Brauche Hilfe in Java Eclipse Programmieraufgabe Neuling Java Basics - Anfänger-Themen 3
R Eclipse Methodenhilfe Java Basics - Anfänger-Themen 2
R Java (Eclipse) "Lagerverwaltung" HILFE Java Basics - Anfänger-Themen 13
L babylonisches Wurzelziehen (Eclipse) Java Basics - Anfänger-Themen 2
C Wie kann ich Versionen eines Projektes in Eclipse erstellen? Java Basics - Anfänger-Themen 3
T Eclipse deinstallieren nicht vorhanden? Java Basics - Anfänger-Themen 4
M Java Einstellung von Apache POI für MS Word Erstellung mit Eclipse Java Basics - Anfänger-Themen 6
C system cannot be resolved Fehler in Eclipse Java Basics - Anfänger-Themen 18
B Einbindung e(fx)clipse in Eclipse Java Basics - Anfänger-Themen 11
J Can't start eclipse Java Basics - Anfänger-Themen 5
H Eclipse kann nicht gestartet werden .... Java Basics - Anfänger-Themen 15
J Erste Schritte Unable to launch eclipse Java Basics - Anfänger-Themen 2
pkm Eclipse wie mit anderer JAVA-Version starten? Java Basics - Anfänger-Themen 1
S Ist dies ein Bug in Eclipse Java Basics - Anfänger-Themen 2
F Klassen und Pakete Projektübergreifend (Eclipse) Java Basics - Anfänger-Themen 6
W Eclipse Autoformatierung für Streams ändern ? Java Basics - Anfänger-Themen 1
R Erste Schritte Eclipse - Java - System.out.println(); funktioniert nicht Java Basics - Anfänger-Themen 2
Franzi1001 Probleme mit Eclipse Java Basics - Anfänger-Themen 7
I GUI über Eclipse oder NetBeans Java Basics - Anfänger-Themen 23
A Eclipse-Fenster starten statt Konsoleausgabe Java Basics - Anfänger-Themen 2
steven789hjk543 Kann man mit Java und Eclipse einen Virus programmieren? Java Basics - Anfänger-Themen 13
H Was sind Package bei eclipse? Java Basics - Anfänger-Themen 1
C NoClassDefFoundError mit externer Jar bei Start aus Eclipse Java Basics - Anfänger-Themen 3
L Linux Befehle unter Windows in Eclipse ausführen Java Basics - Anfänger-Themen 3
S Eclipse Installation Java Basics - Anfänger-Themen 9
I JDK installieren Java JDK und Eclipse Installation Java Basics - Anfänger-Themen 6
H JUnit in Eclipse: java.lang.NoClassDefFoundError: Java Basics - Anfänger-Themen 9
J Eclipse Umgebungsvariable? Java Basics - Anfänger-Themen 1
B Eclipse spielt Sound nicht ab Java Basics - Anfänger-Themen 12
M OOP No enclosing instance... in Eclipse Java Basics - Anfänger-Themen 3
F Warum erhalte ich diese Fehler bei der Einbindung von SQLite JDBC in Eclipse? Java Basics - Anfänger-Themen 1
J Windows Builder auf Eclipse portable Java Basics - Anfänger-Themen 1
J Eclipse Einrichten : Umzug in anderen Ordner Java Basics - Anfänger-Themen 2
N Project layout eclipse ( seperate ordner für klassen ? ) Java Basics - Anfänger-Themen 1
Ellachen55 Weihnachtsbaum in Eclipse programmieren Java Basics - Anfänger-Themen 6
O Eclipse - Debugger Java Basics - Anfänger-Themen 2
W Eclipse Che Scanner Java Basics - Anfänger-Themen 8
V Vererbung Eclipse startet das Programm nicht und rechnet nicht Java Basics - Anfänger-Themen 6
P Eclipse hat Verbindungsproblem? Java Basics - Anfänger-Themen 13
F Installieren von eclipse Java Basics - Anfänger-Themen 1
E Apache Derby mit Eclipse Java Basics - Anfänger-Themen 2
B Kann man eine Tabelle in Eclipse erzeugen und damit arbeiten? Java Basics - Anfänger-Themen 8
H Eclipse Git importieren Java Basics - Anfänger-Themen 2
D Eclipse und Github kann nicht committen Java Basics - Anfänger-Themen 3
felix92 eclipse Problem Java Basics - Anfänger-Themen 12
B Eclipse Tabellen Farbe ändern? Java Basics - Anfänger-Themen 2
das_leon Erste Schritte Eclipse startet nicht Java Basics - Anfänger-Themen 1
F (Eclipse) Beim importieren etwas fehlerhaft bitte um Hilfe :) Java Basics - Anfänger-Themen 3
J Eclipse Export Probleme Java Basics - Anfänger-Themen 25
F In Eclipse Haltepunkt bei Event setzen? Java Basics - Anfänger-Themen 1
W Externe class in Eclipse importieren Java Basics - Anfänger-Themen 0
S Klassen Problem mit Eclipse Java Basics - Anfänger-Themen 4
A Reader für Benutzereingabe in Eclipse importieren Java Basics - Anfänger-Themen 3
AppGuruCode962 Eclipse luna java 8 Java Basics - Anfänger-Themen 15
B Java Eclipse Programm in einer Batch ausführen Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben