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

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

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

例如:

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

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

有帮助吗?

解决方案

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

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

其他提示

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

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

可以使用 Execute around 惯用法分解 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,您可以执行语句、循环结果、关闭资源并包装异常。

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

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

然而,异常确实有其用途,可以使错误处理更加清晰。您可以编写自己的异常并捕获您正在做的任何事情。不再向用户返回任意错误代码!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top