8

例如:

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

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

4

2 回答 2

11

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

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

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

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

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

于 2013-10-31T07:12:48.477 回答
2

finally 会在 try 后立即执行。它在构造函数中并不重要。它在JLS中有很好的定义。

它说:

通过首先执行 try 块来执行带有 finally 块的 try 语句。然后有一个选择:

  • 如果try块的执行正常完成,则执行finally块,然后有一个选择:
    • 如果 finally 块正常完成,则 try 语句
      正常完成。
    • 如果 finally 块由于原因 S 突然完成,则 try 语句由于原因 S 突然完成。
于 2013-10-31T07:12:53.150 回答