Java - 无法在缩短的行中创建对象

时间:2014-09-06 08:13:26

标签: java

最近我在短暂的休息后再次开始使用Java编程,在为朋友做项目时我发现了一些奇怪的事情:看来你不能用缩短的ifs创建对象,例如:

if( condition )
     Statement statement = con.createStatement();

(为简单起见,我将代码缩短了。)

我收到一条错误消息,指出Statement(来自java.sql包的类)无法解析为变量,但是,如果我用括号包装代码,它将正常工作。

我认为这是编译器将其转换为多行语句的一些问题,但我不确定,我想知道这种行为的原因,提前感谢!

2 个答案:

答案 0 :(得分:7)

你不能在那里声明一个变量(来自Java 8的当前错误是error: variable declaration not allowed here)。如果你考虑一下,它是有道理的:你没有创建一个新的范围(但使用一个块),但你创造的情况有时在当前范围内,会有一个statement变量,有时则不会。 E.g:

if (condition)
    Statement statement = con.createStatement();

// Does `statement` exist here? What would Schrodinger say?

如果你使用一个块,它就澄清了这个问题:变量存在,但只在块内。

if (condition) {
    Statement statement = con.createStatement();
    // `statement` exists here
}
// `statement` does not exist here

如果您希望statement存在于当前范围内,则必须将声明与初始化分开:

Statement statement;

if (condition)
    statement = con.createStatement();

但是,您遇到了statement 可能尚未初始化的问题。为避免这种情况,您有几个选择:

Statement statement;

if (condition)
    statement = con.createStatement();
else
    statement = null;

Statement statement = condition ? con.createStatement() : null;

当然,只需使用该块,只在其中使用statement。 FWIW - 这完全取决于你 - 我(以及许多样式指南)建议使用块始终,因为如果不这样做可能会在您需要(不可避免地!)添加第二个语句时引入维护问题if的主体......

答案 1 :(得分:2)

根据Java specification

  A local variable, one of the following:
       A local variable declared in a block (§14.4)
       A local variable declared in a for statement (§14.14)

如果你没有将语句包装在大括号内,它会立即超出范围。

此处有更多信息:https://stackoverflow.com/a/9206679/978501