最近我在短暂休息后再次开始使用 Java 编程,在为 friend 做项目时我注意到一些奇怪的事情:看起来你不能在缩短的 ifs 中创建对象,例如:
if( condition )
Statement statement = con.createStatement();
(为了简单起见,我缩短了代码。)
我收到一条错误消息,指出 Statement
(java.sql
包中的一个类)无法解析为变量,但是,如果我要包装带大括号的代码可以正常工作。
我认为这是编译器将其转换为多行语句的一些问题,但我不确定,我想知道这种行为的原因,在此先感谢!
您不能在那里声明变量(Java 8 中的当前错误是错误:此处不允许声明变量
)。如果你仔细想想,这是有道理的:你没有创建一个新的范围(但使用了一个 block ),但你正在创建一种情况,在这种情况下,有时在当前范围内,会有一个语句
变量,其他时候不会。例如:
if (condition)
Statement statement = con.createStatement();
// Does `statement` exist here? What would Schrodinger say?
如果你使用一个 block ,它澄清了这个问题:变量存在,但只在 block 内。
if (condition) {
Statement statement = con.createStatement();
// `statement` exists here
}
// `statement` does not exist here
如果你想让语句
存在于当前作用域中,你必须将你的声明和你的初始化分开:
Statement statement;
if (condition)
statement = con.createStatement();
但是随后您遇到了 statement
可能 尚未初始化的问题。为避免这种情况,您有两种选择:
Statement statement;
if (condition)
statement = con.createStatement();
else
statement = null;
或
Statement statement = condition ? con.createStatement() : null;
或者当然,只使用 block 并且只在其中使用语句
。 FWIW——这完全取决于你——我(和许多风格指南)建议总是使用 block ,因为不这样做会在你需要(不可避免地!)添加第二条语句时引入维护问题if
...
的主体