【发布时间】:2017-11-09 18:34:00
【问题描述】:
第一季度:(已删除)
Q2 : try-with-resource 创建自己的资源实现AutoCloseable 接口并覆盖close() 方法。
来自 javadoc
任何实现 java.lang.AutoCloseable 的对象,包括所有实现 java.io.Closeable 的对象,都可以用作资源。
所以,我在这里创建了一个简单的程序MyAuto.java
class Demo implements AutoCloseable {
public void show() {
System.out.println("show");
}
public void close() {
System.out.println("close from demo");
}
}
class MyAuto {
public static void main(String[] args) {
try(Demo d = new Demo()) {
int x = 10/0;
d.show();
}catch(ArithmeticException e) {
System.out.println(e);
}
}
}
这个程序运行良好。 :) 并给出输出
close from demo :如预期的那样,无论发生什么异常,d都会被关闭。
但我的问题是我没有编写任何关闭此资源的代码,我只是放了一个打印语句。这里实际上关闭资源是什么意思?将null 分配给资源的引用变量或其他任何东西?
或者JVM 在后台运行close() 之后运行任何其他方法。
最后是最重要的问题..
Q3 : 在上述场景中如果我添加自己的接口AutoCloseable
interface AutoCloseable {
void close() throws Exception;
}
它在编译MyAuto.java时给出编译时错误
error: incompatible types: try-with-resources not applicable to variable type
try(Demo d = new Demo()) {
^
(Demo cannot be converted to AutoCloseable).
所以,请告诉我为什么会这样。为什么我们不能创建和使用我们自己的接口而不是 java 提供的接口。我的界面和预定义的界面有什么区别,虽然两者都是一样的。
【问题讨论】:
-
您是否查看过 try-with-resources 的工作原理?我怀疑互联网上到处都是关于它们的指南。
-
对第一个问题很抱歉,但第二个和第三个问题是相关的@T.J.Crowder
-
@SandeepRawat:很公平,我冒昧地删除了第一个问题(因为这样做似乎并没有使任何已发布的答案无效)。 (如果你不同意删除它,你可以使用“回滚”功能——点击“Edited XYZ ago”链接,你会看到它。)
-
@Carcigenicate 每个人都在谈论如何,这是我知道的,但我想知道为什么?这就是我在这里发帖的原因