Frage

In C ++ wir eine Ressource in einem Konstruktor zu erwerben und lassen Sie ihn in einem destructor.

Also, wenn eine Ausnahme in der Mitte einer Funktion steigt es keine Ressourcen-Leck oder gesperrt mutexes oder was auch immer sein.

AFAIK Java-Klassen haben keine Destruktoren. So wie man das Ressourcenmanagement in Java macht.

Zum Beispiel:

public int foo() {    
    Resource f = new Resource();
    DoSomething(f);
    f.Release();
}

Wie eine Ressource freigeben kann, wenn DoSomething löst eine Ausnahme? Wir können nicht \ catch-Blöcke in dem ganzen Code setzen versuchen, können wir?

War es hilfreich?

Lösung

Ja, Sie können und sollten setzen try / catch / finally um den Code zu blockieren. In C # ist eine Abkürzung dort „mit“ Aussage, aber in Java sind Sie stecken mit:

public int foo() {
    Resource f = new Resource();
    try {
        DoSomething(f);
    }
    finally {
        f.Release();
    }
}

Andere Tipps

Diese Frage bis 2008 stammt und daher bezieht sich auf Java 6. Seitdem Java 7 freigegeben wurde, die eine neue Funktion für die automatische Resource Management enthält. Für eine aktuellere Frage, die Java 7 relevant ist zu sehen, diese Frage:

Java-Techniken für die automatische Ressourcenfreigabe? "Prompt Bereinigung"?

Es ist möglich, ausklammern try / finally (und Ausnahme und Algorithmen) mit dem um Idiom Ausführen. Allerdings ist die Syntax ist sehr ausführlich.

public int foo() {
    withResource(new WithResource() { public void run(Resource resource) {
        doSomething(resource);
    }});
}

...

public interface WithResource {
    void run(Resource resource);
}

public static void withResource(WithResource handler) {
    Resource resource = new Resource();
    try {
        handler.run(resource);
    } finally {
        resource.release();
    }
}

So etwas macht mehr Sinn, wenn Sie mehr sind abstrahiert als try / finally. Zum Beispiel mit JDBC können Sie eine Anweisung, eine Schleife durch die Ergebnisse, in der Nähe Ressourcen ausführen und die Ausnahme wickeln.

Wenn Sie wollen, dass die Verwendung von Block in der Java-Schließung Debatte einlassen: S

Es tut uns Leid, Sie zu enttäuschen, aber in Java wir : Probieren \ Fang \ schließlich Blöcke viel. Und mit "viel", ich meine A LOT . Ich mache manchmal wünschen, dass Java die C # Block hat. Die meiste Zeit werden Sie nicht brauchen, um Ressourcen wie Java Garbage Collector frei werden sich darum kümmern.

Allerdings Ausnahmen tun haben ihren Nutzen bei der Herstellung Fehler viel sauberer Handhabung. Sie können Ihre eigenen Ausnahmen schreiben und fangen sie für alles, was Sie tun. Keine Rückkehr beliebige Fehlercodes für den Benutzer!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top