java - 在 Java 中,什么时候执行构造函数中的最后一个 block ?

标签 java constructor try-finally

例如:

/**
 * Constructor
 */
public Test(InputStream in){
   try{
      this.inputStream = in;
   } finally{
      inputStream.close();
   }
}

在创建Test对象后是否立即关闭传递给指导者的InputStream?还是在 Test 对象被销毁时关闭?我不知道如何在 C++ 中实现类似于析构函数的东西。

最佳答案

它作为构造函数的一部分执行。在构造函数中执行的代码只是普通代码——那里没有奇怪的控制流。 (我的意思是在调用父类(super class)构造函数并运行变量/实例初始化器之后。)

在 Java 中没有与 C++ 析构函数等效的东西。最接近的是 finalizer ,但它应该用作 C++ 析构函数的等价物。 (您几乎不应该编写终结器。在某些情况下,它们不会在关闭时被调用,并且它们被非确定性地调用。)

在您给出的情况下,您可能不希望您的类承担关闭输入流的责任——通常打开流的代码也负责关闭它。但是,如果您确实想对此负责,或者只是让调用者更容易,您可能想要公开一个 close() 方法来关闭流.你可能想要实现 AutoCloseable也,以便调用者可以使用 try-with-resources statement与你的类(class):

try (Test test = new Test(new FileInputStream("foo.txt")) {
    // Do stuff with test
}

这将在 try block 的末尾自动调用 test.close()

关于java - 在 Java 中,什么时候执行构造函数中的最后一个 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19700350/

相关文章:

java - 如何使用 UCanAccess 更改表

java - 是否有适用于 Vista 和 Freebsd 的 Javax.comm 第三方解决方案?

java - 通过 Maven 编译 Java 7 代码

c++ - 父类(super class)需要比初始化列表提供的更多的信息

c++ - try __finally block 中可能的堆栈损坏

java - 在 Java 中使用 try-finally 的好习惯?

java - @Autowired注解有什么好处?

c++ - 不打印带有 int 的字符串构造函数

c# - 有约束的结构

java - 关于finally block