Q1:(已删除)
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将被关闭。
但我的问题是我没有编写任何关闭此资源的代码,我只是简单地写了一个print语句。这里实际关闭资源意味着什么?将null
分配给资源或其他任何参考变量?
或者JVM
在场景后面运行close()
后运行任何其他方法。
最后是最重要的问题..
问题3:在上面的场景中,如果我添加自己的界面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提供的接口。虽然两者都相同,但我的界面和预定义界面之间有什么区别。
答案 0 :(得分:0)
我的界面与预定义界面有什么区别,尽管两者都相同。
他们 不 相同。不是长篇大论。
AutoCloseable
所需的try-with-resources
为java.lang.AutoCloseable
。 您的自定义AutoCloseable
不是来自该软件包,因此Java不会尊重它。
最重要的是,介绍这不是最好的方法,因为它只会导致令人困惑的语义和后来的糟糕体验,即使你选择让你的界面因任何原因延长java.lang.AutoCloseable
以同样的方式......
...我没有编写任何关闭此资源的代码,我只是放了一个print语句。这里实际关闭资源意味着什么?为资源或其他任何参考变量分配null?或者JVM在场景后面运行close()后运行任何其他方法。
界面无法强制执行此类操作。它所能做的就是提供一种机制,如果实施得当,它将按照您的预期行事。