2008-09-12 49 views
6

在C++中,我们在构造函数中获取资源并在析构函数中释放资源。java中的无痛资源管理

因此,当一个函数中间出现异常时,将不会有资源泄漏或锁定的互斥锁或任何东西。

AFAIK java类没有析构函数。那么我们如何做Java中的资源管理。

例如:

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

如何可以的,如果DoSomething的抛出一个异常,一个释放资源?我们不能在代码中放置try \ catch块,我们可以吗?

回答

4

是的,你可以,应该把你的代码周围try/catch/finally块。在C#中有一个速记“使用”的声明,但在Java中你被卡住:

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

如果你想使用块涉足的java结束辩论:S

+0

哪里是在辩论? – Spoike 2008-09-12 09:36:07

+0

遍布互联网: http://www.google.dk/search?q=java+closures – svrist 2008-09-20 15:38:23

-1

抱歉让你们失望,但在Java中,我们使用try \ catch \ 终于阻止了很多。 “很多”,我的意思是A LOT。我有时希望Java具有C#使用块。大多数情况下,您不需要释放资源,因为Java的垃圾回收器会照顾到这一点。

但是,异常在使错误处理更加清晰的情况下有其用处。你可以编写你自己的例外,并为你正在做的任何事情捕捉它们。不再向用户返回任意的错误代码!

+1

是的!让我们开始将他们难以理解的堆栈痕迹返回给他们! – 2008-09-12 09:57:00

3

使用Execute around idiom可以将try/finally(以及异常和算法)分解出来。但是,语法非常冗长。

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(); 
    } 
} 

这样的事情更有意义,如果你是抽象比try/finally更多。例如,使用JDBC,您可以执行语句,循环遍历结果,关闭资源并包装异常。