使用条件表达式尝试使用资源

时间:2016-01-07 12:54:10

标签: java intellij-idea

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错误还是有效点?

2 个答案:

答案 0 :(得分:2)

我认为IDEA对此感到困惑。对我来说,这似乎是有效的try-with-resourcesJLS§14.20.3将语句的 Resource 部分显示为:

  

资源:   
   {VariableModifier} UnannType VariableDeclaratorId = Expression

...并且似乎没有对 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();
            }
        }
    }
}

......就可以了。

答案 1 :(得分:2)

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

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

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