预先说明:我现在正在做一个做Java的C#人。其中一些挫折来自于我缺乏Java知识。
首先,是否有一种方法可以安全地使用"安全" AutoCloseable
实施不需要检查Exception
?如果我对我自己的班级不感兴趣,我不会从close
方法中抛弃,我就不明白为什么要检查它。
第二,有没有办法简化try
声明中我不关心返回内容的表达方式?例如在C#中,我可以这样做:
using (new Disposable())
{
// yay!
}
和Java似乎迫使我将它分配给一个临时变量:
try (AutoCloseable iDontCare = getAutoCloseable()) {
// dont you dare use iDontCare
}
我希望我能将Java简化为
try (getAutoCloseable()) {
// yay!
}
答案 0 :(得分:2)
C#并不是Java;这是你未来必须处理的问题之一。
首先,是否有一种方法可以安全地使用"安全"
AutoCloseable
实施不需要检查Exception
?如果我对我自己的班级不感兴趣,我不会从close
方法中抛弃,我就不明白为什么要检查它。
你有到因为it's mandated by the interface.不仅仅是这样,但它会抛出一个已检查的异常, 必须在某个级别处理。
如果你知道你的代码永远不会抛出任何类型的异常,你仍然可以将异常的抛出放在某种保证 - 不执行 - 阻止您实现的close
方法内部。或者,实现您自己的扩展AutoCloseable
的接口,并覆盖close
到而不是抛出异常。
答案 1 :(得分:1)
你的第一个问题:
是。如果您的实现没有抛出已检查的异常,则可以在没有抛出异常部分的情况下实现AutoCloseable.close。
你的第二个问题:
没有。 try with resources语句需要该变量。您可以将其重命名为忽略或未使用的内容,以使其清晰。
final class Test implements AutoCloseable {
@Override
public void close() {
System.out.println("Closing");
}
public static void main(String[] args) {
try (Test ignored = new Test()) {
System.out.println("Not using ignored");
}
}
}
答案 2 :(得分:0)
Makoto的回答很好地解决了问题的第一部分,所以我将尝试解决第二部分问题。
我认为你想要的是一次尝试(没有资源)。例如:
try {
//yay!
} finally {
// always executed
}
无论是否抛出异常,finally
块都将执行。
修改强> 如果您不需要执行任何操作,则可以声明一个新块
{
//yay!
}