gpt4 book ai didi

java - 在构造期间抛出异常后清理

转载 作者:行者123 更新时间:2023-11-30 10:15:49 27 4
gpt4 key购买 nike

我目前正在我的构造函数中实例化一些对象,这些对象需要在完成后调用 .close() 。如果在那个序列中一个对象抛出异常,我该如何清理到目前为止已经分配的对象。这会带来一个问题,即调用函数(即使它使用了 try-finally)永远不会获得调用 .close 的引用,因为对象从未完成构造。

我的想法:

  • 捕获基异常类并在所有非空的情况下调用关闭(但是您不应该捕获异常类)
  • 使用终结器(被认为是不良做法,因为终结器是 not a 'second chance' to clean up )。
  • 在“load”或“start”方法中实例化这些对象(类的使用者需要知道调用此方法,也意味着对象在构建和调用此方法之间暂时处于不完整状态)<

示例代码:

class MyClass implements AutoCloseable {
private EarthConnection earth;
private SolarConnection solar;
public MyClass() {
earth = new EarthConnection();
solar = new SolarConnection(); // exception thrown by this connection
}

public close() {
if (earth != null) {
earth.close();
}
if (solar != null) {
solar.close();
}
}
}

// Caller
try (MyClass myClass = new MyClass()) {
// do work - note if MyClass wasn't fully constructored it can't call the close method on it.
}

在上面的示例中,如果 SolarConnection 抛出异常,我该如何清理分配的 EarthConnection?

最佳答案

try-with-resources怎么样? (假设您使用的是 Java 7 或更高版本)?如果您在 try 部分创建对象,那么它将自动关闭而不会捕获异常。这种方法的唯一缺点是您仍然可以在 try 部分之外创建对象,然后它不会被关闭。

关于java - 在构造期间抛出异常后清理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50304878/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com