6

在 C++ 中,我们在构造函数中获取资源并在析构函数中释放它。

因此,当函数中间出现异常时,不会出现资源泄漏或锁定互斥锁或其他任何情况。

AFAIK java 类没有析构函数。那么如何在Java中进行资源管理。

例如:

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

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

4

5 回答 5

4

是的,您可以并且应该在代码周围放置 try/catch/finally 块。在 C# 中有一个简写的“使用”语句,但在 Java 中你会遇到:

public int foo() {
    Resource f = new Resource();
    try {
        DoSomething(f);
    }
    finally {
        f.Release();
    }
}
于 2008-09-12T09:27:57.007 回答
4

这个问题可以追溯到 2008 年,因此与 Java 6 有关。从那时起,Java 7 已经发布,其中包含自动资源管理的新功能。有关与 Java 7 相关的最新问题,请参阅此问题:

自动资源释放的java技术?“及时清理”?

于 2011-10-23T13:15:43.040 回答
2

可以使用 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,您可以执行语句、遍历结果、关闭资源并包装异常。

于 2008-09-12T12:28:25.107 回答
0

如果您希望 using 块参与 Java 闭包辩论:S

于 2008-09-12T09:35:12.620 回答
-1

很抱歉让您失望了,但在 Java 中,我们确实使用 try\catch\finally 阻塞了很多。对于“很多”,我的意思是A LOT。我有时确实希望 Java 有 C# using 块。大多数情况下,您不需要释放资源,因为 Java 的垃圾收集器会处理这些问题。

但是,异常确实可以使错误处理更加清晰。您可以编写自己的异常并在您正在执行的任何操作中捕获它们。不再向用户返回任意错误代码!

于 2008-09-12T09:45:59.037 回答