封闭的资源在 Java 中应该如何表现?

Gyo*_*ely 7 java autocloseable

我有一个在内部保存 Closeable 资源的 java 类。这意味着我的类还实现了 Closeable 接口并在其自己的 close() 方法中关闭了内部资源。

我的类关闭的预期行为是什么,通常是 Java 中的任何关闭对象?我看到该对象处于失效状态,其内部结构已关闭,但客户仍对其有引用。IMO 访问它是一个编程错误,但错误会不时发生,因此即使在这种情况下,行为也应该是合理的......

我是不是该?

  • 在所有方法调用上抛出异常,例如:IllegalState
  • 像什么都没发生一样闭上眼睛,让异常通过关闭资源?

什么是规范的 Java 方式?

Jas*_*son 5

在内部资源关闭后尝试访问内部资源时,您应该抛出异常,IllegalStateException 就可以了。值得注意的一件事是,您可以在 try-with-resources 中使用 Closeable 以进一步确保一旦对象超出范围,它就会关闭。


And*_*eas 3

Java 的规范方式是什么?

首先,我们看一下该close()方法的javadoc:

关闭该流并释放与其关联的所有系统资源。如果流已经关闭,则调用此方法无效。

因此,对于该方法,您的选择的答案是“以上都不是” close()。您不会引发异常,也不会让异常从已关闭的资源中通过。如果已关闭,则调用必须是 NOOP。

现在,让我们看一下其中的一些类Closeable

  • FileInputStream.read()

    IOException如果发生 I/O 错误则抛出。

    这包括“文件已关闭”。

    这适用于所有 InputStream/OutputStream/Reader/Writer I/O 类。

  • FileSystem.close()

    文件系统关闭后,对文件系统的所有后续访问(通过此类定义的方法或与此文件系统关联的对象)都会抛出ClosedFileSystemException。如果文件系统已关闭,则调用此方法无效。

  • Formatter.close()

    ioException()关闭此格式化程序后尝试调用除此格式化程序之外的任何方法将导致FormatterClosedException.

  • URLClassLoader.findClass(name)

    ClassNotFoundException如果找不到类或者加载器已关闭,则抛出异常。

结论:所有方法(除了close())都会抛出异常,但不是IllegalStateException

如果你愿意的话当然可以使用IllegalStateException