首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将nusances从AutoCloseable中剔除

将nusances从AutoCloseable中剔除
EN

Stack Overflow用户
提问于 2017-03-18 01:39:44
回答 3查看 1.3K关注 0票数 0

首先:我是一个正在做C#的人。其中一些挫折来自于我对Java知识的缺乏。

首先,有没有一种方法可以让一个“安全的”AutoCloseable实现不需要检查Exception?如果我自己的类不会从它的close方法中抛出,我就不明白为什么要检查它。

其次,有没有一种方法可以简化try语句中的表达式,让我不关心返回的内容?例如,在C#中,我可以这样做:

代码语言:javascript
复制
using (new Disposable()) 
{
    // yay!
}

而Java似乎迫使我将其赋给一个临时变量:

代码语言:javascript
复制
try (AutoCloseable iDontCare = getAutoCloseable()) {
    // dont you dare use iDontCare
}

我希望我能把Java简化为

代码语言:javascript
复制
try (getAutoCloseable()) {
    // yay!
}
EN

回答 3

Stack Overflow用户

发布于 2017-03-18 01:48:27

C#不完全是Java语言;这是您今后必须处理的问题之一。

首先,有没有一种不需要检查Exception的“安全”AutoCloseable实现方法?如果我自己的类不会从它的close方法中抛出,我就不明白为什么要检查它。

您必须这样做,因为it's mandated by the interface.不仅如此,它还抛出了一个检查过的异常,这在某种程度上是必须处理的。

如果您知道您的代码永远不会抛出任何类型的异常,您仍然可以将抛出的异常放在已实现的close方法内的某种保证不会被执行的块中。或者,实现您自己的接口,该接口扩展AutoCloseable并覆盖close以不抛出异常。

票数 3
EN

Stack Overflow用户

发布于 2017-03-18 01:55:20

你的第一个问题:

是。如果您的实现没有抛出检查过的异常,那么您可以在没有抛出异常的情况下实现AutoCloseable.close。

你的第二个问题:

不是的。try with resources语句需要该变量。您可以将其重命名为类似于忽略或未使用的名称,以清楚地说明这一点。

代码语言:javascript
复制
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");
        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2017-03-18 01:54:39

Makoto的回答很好地解决了您问题的第一部分,所以我将尝试解决第二部分。

我认为你想要的是一次尝试(没有资源)。例如:

代码语言:javascript
复制
try {
    //yay!
} finally {
   // always executed
}

无论是否抛出异常,finally块都将执行。

编辑:如果你不需要任何东西来执行,你只需要声明一个新的块

代码语言:javascript
复制
{
    //yay!
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42863946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档