繁体   English   中英

使用条件表达式尝试资源

[英]Try-with-resources using conditional expression

Intellij IDEA 14看到以下代码时,警告我“ PrintStream不带try-with-resources使用”:

public static void main(String[] args) throws IOException {
    try (PrintStream out = args.length > 0 ? new PrintStream(args[0]) : null) {
        if (out != null)
            out.println("Hello, world!");
    }
}

使用javap -c可以看到,在try块末尾资源已按预期关闭。

如上所述,仅当在条件表达式中创建资源时才发出警告。 以典型方式完成时不会发出。

这是一个IDEA错误还是有道理?

我认为IDEA对此感到困惑。 对我来说,这似乎是一种有效的try-with-resources JLS§14.20.3将语句的“ 资源”部分显示为:

资源:
{VariableModifier} UnannType VariableDeclaratorId = 表达式

...并且似乎没有对Expression施加限制。 因此,我看不出为什么可能会产生null的表达式会使它以某种方式无效,以及§14.20.3.1中翻译的“简单”示例:

{
    final {VariableModifierNoFinal} R Identifier = Expression;
    Throwable #primaryExc = null;

    try ResourceSpecification_tail
        Block
    catch (Throwable #t) {
        #primaryExc = #t;
        throw #t;
    } finally {
        if (Identifier != null) {
            if (#primaryExc != null) {
                try {
                    Identifier.close();
                } catch (Throwable #suppressedExc) {
                    #primaryExc.addSuppressed(#suppressedExc);
                }
            } else {
                Identifier.close();
            }
        }
    }
}

...就可以了。

您的代码原则上没有问题,因此可以忽略IntelliJ给出的警告。

但是,如果您这样编写代码,则代码将更加清晰:

public static void main(String[] args) throws IOException {
    if (args.length > 0) {
        try (PrintStream out = new PrintStream(args[0])) {
            out.println("Hello, world!");
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM