Java und keyboard.close()

  • Java

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von KaskadekingDE.

    Java und keyboard.close()

    In Zeile 13 gibt mir java den berümt berüchtigten Ressource leak fehler. Ich bin neu in Java, aber eigentlich habe ich das doch am ende der Class geschlossen... Ich habe es auch mal so versucht, dass der keyboard für beide Variablen nimmt, aber da trat das selbe an selbiger Zeile auf. Nicht einmal unten bei der anderen Keyboard variablen. Ich habe keinen Java Quellcode emulator hier in der Leiste gefunden, ich hoffe vb klappt auch...

    VB.NET-Quellcode

    1. import java.util.Scanner;
    2. public class Klasse2 {
    3. public static void main(String[] args) {
    4. double zahl1;
    5. double zahl2;
    6. double zahl3;
    7. Scanner keyboard1 = new Scanner (System.in);
    8. System.out.print("Bitte geben sie einen Betrag ein, mit dem Sie starten möchten: ");
    9. zahl1 = keyboard1.nextDouble();
    10. Scanner keyboard = new Scanner (System.in);
    11. System.out.print("Bitte geben Sie den zu addierenden Betrag ein:");
    12. zahl2= keyboard.nextDouble();
    13. zahl3 = zahl1 + zahl2;
    14. System.out.println("Das Ergebnis beträgt: " +zahl3+ " €"+" nach der Rechnung");
    15. keyboard1.close();
    16. keyboard.close();
    17. }
    18. }
    "Der Visual Basic ist nur so schlau wie der, der davor sitzt" - Na schön! Dann steh ich eben auf!

    "Wenn du denkst es geht nicht mehr kommt irgendwo ein Lichtlein her"
    If Tunnel.Licht = JemandImTunnelDerVerzweifeltIst Then Licht.Aus = True
    Sag mir wenn ich falsch liege, aber ich sehe keinen unterschied ob ich die Variable nun keyboard oder scanner nenne. Und was heißt hier try und finally? Außer der Variablen ist ja nichts bedeutendes verändert...
    "Der Visual Basic ist nur so schlau wie der, der davor sitzt" - Na schön! Dann steh ich eben auf!

    "Wenn du denkst es geht nicht mehr kommt irgendwo ein Lichtlein her"
    If Tunnel.Licht = JemandImTunnelDerVerzweifeltIst Then Licht.Aus = True
    @Kathleen
    Alles was in try steht wird "versucht", wenn das abgeschlossen ist/geklappt hat wird finally aufgerufen und das was zwischen finally steht wird "ausgeführt" ;)
    Ein kleines Beispiel:

    Quellcode

    1. try {
    2. versuch1();
    3. }
    4. finally {
    5. print("Versuch 1 hat geklappt!");
    6. }



    Hier etwas zum einlesen: softwareproduction.de/programming/java/java_2_12.html

    Software being "Done" is like lawn being "Mowed". (Jim Benson)
    try und finally sind aber sehr bedeutende Änderungen ;)
    Folgende Situation: Zwischen new Scanner(...) und keyboard.close tritt ein Fehler auf, z.B. weil der Benutzer Buchstaben anstatt einer Zahl eingegeben hat. Die Methode nextDouble wirft eine Exception (wie soll man Buchstaben in Zahlen umwandeln?), das Programm wird abgebrochen und die close-Methode wird nie aufgerufen. Das hätte (theoretisch) ein Leak zufolge.
    Der Code im finally wird immer* ausgeführt, selbst wenn ein Fehler im try-Block auftritt. Folge: Kein Leak, alle zufrieden.


    *) Zumindest fast immer. Gibt da ein paar Spezialfälle, die aber für dich unerheblich sein sollten.

    Edit:
    @KidRick: Nicht ganz, das erreichen des finally-Blocks sagt nichts darüber aus, ob die Aktionen im try-Block alle vollständig ausgeführt wurden.

    3daycliff schrieb:

    Nicht ganz, das erreichen des finally-Blocks sagt nichts darüber aus, ob die Aktionen im try-Block alle vollständig ausgeführt wurden.

    Danke für den Hinweis ;)
    Software being "Done" is like lawn being "Mowed". (Jim Benson)
    @KidRick Jo, sonst würde das ja nichts bringen. Wenn Du jetzt irgendwelche Daten einliest und es ein Problem gibt, dann muss ja der Stream trotzdem geschlossen werden.
    finally wird immer aufgerufen. using macht btw genau das selbe, es setzt um den Code ein try-finally.
    Wobei das dann wieder C# wäre...

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    3daycliff schrieb:

    Nicht immer

    Mir wäre da, um ehrlich zu sein, kein Fall bekannt. Wo zum Beispiel würde es nicht aufgerufen? ^^

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Achso. Naja, wenn die Anwendung auf einen Schlag davor noch beendet wird, dann ist das ja eigentlich klar, dass die auch nichts mehr ausführt.
    Gehen wir mal nicht von so einem Fall aus, sondern dass das Programm entsprechend noch läuft, dann stimmt die Aussage. ;)

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Also euer try ist ja schön und gut, und ich habe auch schonmal gelesen, man soll sich die werte wiedergeben lassen, aber um eine Wertzuweisung zu haben, sollte der doch erstmal starten, nicht? Hier, das spuckt der mir aus(s. Bild). Ich vermute mal, der kommt irgendwie nicht damit klar, dass der nach erstellen der Variabel zahl1 die Variable Keyboard einfach mit nem neuen Wert füttern darf und den alten wert löschen soll. das mit dem .close() soll ans ende, so war es jedenfalls in dem abgewandelten beispiel bei einfacher zuweisung der Var.
    Bilder
    • Dublicate local variable keyboard.GIF

      41,03 kB, 757×854, 113 mal angesehen
    "Der Visual Basic ist nur so schlau wie der, der davor sitzt" - Na schön! Dann steh ich eben auf!

    "Wenn du denkst es geht nicht mehr kommt irgendwo ein Lichtlein her"
    If Tunnel.Licht = JemandImTunnelDerVerzweifeltIst Then Licht.Aus = True
    ah, ich hab einfach mal 8 und 9 gelöscht, jetzt klappt alles ohne fehlermeldungen :) Danke

    [java]import java.util.Scanner;
    public class Klasse2 {

    public static void main(String args[]) {
    double zahl1;
    double zahl2;
    double zahl3;

    Scanner keyboard1 = new Scanner (System.in);
    System.out.print("Bitte geben sie einen Betrag ein, mit dem Sie starten möchten: ");
    zahl1 = keyboard1.nextDouble();

    Scanner keyboard2 = new Scanner (System.in);
    System.out.print("Bitte geben Sie den zu addierenden Betrag ein:");
    zahl2= keyboard2.nextDouble();

    zahl3 = zahl1 + zahl2;
    System.out.println("Das Ergebnis beträgt: " +zahl3+ " €"+" nach der Rechnung");
    keyboard1.close();
    keyboard2.close();
    }
    }
    [java]
    "Der Visual Basic ist nur so schlau wie der, der davor sitzt" - Na schön! Dann steh ich eben auf!

    "Wenn du denkst es geht nicht mehr kommt irgendwo ein Lichtlein her"
    If Tunnel.Licht = JemandImTunnelDerVerzweifeltIst Then Licht.Aus = True
    aber ich möchte ja zwei benutzereingaben bekommen...
    "Der Visual Basic ist nur so schlau wie der, der davor sitzt" - Na schön! Dann steh ich eben auf!

    "Wenn du denkst es geht nicht mehr kommt irgendwo ein Lichtlein her"
    If Tunnel.Licht = JemandImTunnelDerVerzweifeltIst Then Licht.Aus = True