首先:我是一个正在做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!
}发布于 2017-03-18 01:48:27
C#不完全是Java语言;这是您今后必须处理的问题之一。
首先,有没有一种不需要检查
Exception的“安全”AutoCloseable实现方法?如果我自己的类不会从它的close方法中抛出,我就不明白为什么要检查它。
您必须这样做,因为it's mandated by the interface.不仅如此,它还抛出了一个检查过的异常,这在某种程度上是必须处理的。
如果您知道您的代码永远不会抛出任何类型的异常,您仍然可以将抛出的异常放在已实现的close方法内的某种保证不会被执行的块中。或者,实现您自己的接口,该接口扩展AutoCloseable并覆盖close以不抛出异常。
发布于 2017-03-18 01:55:20
你的第一个问题:
是。如果您的实现没有抛出检查过的异常,那么您可以在没有抛出异常的情况下实现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");
}
}
}发布于 2017-03-18 01:54:39
Makoto的回答很好地解决了您问题的第一部分,所以我将尝试解决第二部分。
我认为你想要的是一次尝试(没有资源)。例如:
try {
//yay!
} finally {
// always executed
}无论是否抛出异常,finally块都将执行。
编辑:如果你不需要任何东西来执行,你只需要声明一个新的块
{
//yay!
}https://stackoverflow.com/questions/42863946
复制相似问题