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错误还是有效点?
答案 0 :(得分:2)
我认为IDEA对此感到困惑。对我来说,这似乎是有效的try-with-resources
。 JLS§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!");
}
}
}