Java - 无法在shortend行中创建对象

Mic*_*695 3 java

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

if( condition )
     Statement statement = con.createStatement();
Run Code Online (Sandbox Code Playgroud)

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

我收到一个错误说Statement(java.sql包中的一个类)无法解析为变量,但是,如果我用括号包装代码它会工作正常.

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

T.J*_*der 7

你不能在那里声明一个变量(来自Java 8的当前错误error: variable declaration not allowed here).如果你考虑它,它是有道理的:你没有创建一个新的范围(但使用一个块),但你正在创建一种情况,有时在当前范围内,将有一个statement变量,其他时候赢得"T.例如:

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

// Does `statement` exist here? What would Schrodinger say?
Run Code Online (Sandbox Code Playgroud)

如果您使用块,它会澄清问题:变量存在,但仅在块内.

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

如果要statement存在于当前作用域中,则必须将声明与初始化分开:

Statement statement;

if (condition)
    statement = con.createStatement();
Run Code Online (Sandbox Code Playgroud)

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

Statement statement;

if (condition)
    statement = con.createStatement();
else
    statement = null;
Run Code Online (Sandbox Code Playgroud)

要么

Statement statement = condition ? con.createStatement() : null;
Run Code Online (Sandbox Code Playgroud)

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

  • 这非常有趣,谢谢你澄清@TJCrowder! (2认同)