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

Java 使用条件表达式尝试使用资源,java,intellij-idea,Java,Intellij Idea,Intellij IDEA 14在看到以下代码时向我发出警告PrintStream在未尝试使用资源的情况下使用: public static void main(String[] args) throws IOException { try (PrintStream out = args.length > 0 ? new PrintStream(args[0]) : null) { if (out != null) out.println("

Intellij IDEA 14在看到以下代码时向我发出警告PrintStream在未尝试使用资源的情况下使用:

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块结束时按预期关闭

只有在条件表达式中创建资源时才会发出警告,如上所述;当以典型方式执行时,不会发布


这是一个想法缺陷还是它有一个正确的观点?

我认为想法只是被它弄糊涂了。在我看来,这是一次有效的资源尝试。将语句的资源部分显示为:

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

…而且似乎没有对表达式施加限制。因此,我不明白为什么一个可能产生null的表达式会使它在某种程度上无效,下面这个简单的例子:


…没问题。

我想这个想法只是被它弄糊涂了。在我看来,这是一次有效的资源尝试。将语句的资源部分显示为:

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

…而且似乎没有对表达式施加限制。因此,我不明白为什么一个可能产生null的表达式会使它在某种程度上无效,下面这个简单的例子:


…没问题。

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

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

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

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

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

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

假设块中有一些代码没有使用PrintStream,这解释了为什么try with resources不在if块中?使用eclipse,这个con't不会给我任何警告。。。它工作得很好!这只是不使用三进制运算符的另一个原因;我开玩笑,但我不是在开玩笑,我发现几乎每一个使用一个的案例,重构可以使内容更易于阅读。特别是对于新开发人员来说,如果您想保存代码,可能只想创建简单的帮助器方法。可能块中有一些代码不使用PrintStream,这解释了为什么“资源试用”不在if块中?使用eclipse,这不会给我任何警告。。。它工作得很好!这只是不使用三进制运算符的另一个原因;我开玩笑,但我不是在开玩笑,我发现几乎所有使用重构的情况下,重构都可以使事情更容易阅读。特别是对于新开发人员来说,如果你想保存代码,可能只想使用简单的helper方法。谢谢,我同意这段代码;然而,我真正的代码要比我在这个问题上使用的精简到最低版本复杂得多;然而,我真正的代码比我在这个问题上使用的精简到最低版本要复杂得多。