Java - 如果

标签 java

<分区>

最近我在短暂休息后再次开始使用 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...

的主体

关于Java - 如果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25698287/

相关文章:

java - 使用某些端点或类的 Azure id_token 有效性

c# - UUID 与 c# 代码互操作

java - ObservableList 抛出 NullPointerException

java - 递归求和列表

java - 高效使用 NUMA 架构

java - 一个项目怎么可能在 eclipse 中编译,但是 javac 抛出编译器错误?

java - Thymeleaf:从 Java 代码访问外部字符串

java - JTabbedPane Tab 组件的 MouseEvents 没有流血

java - 如何重写匿名泛型类的方法?

java - 如何将 CompositeKey 复制/分配到 hadoop 中的另一个 CompositeKey?