2014-09-06 33 views
3

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

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

(I剪切代码短为了简单起见。)

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

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

+1

你能发布一个完整的范例吗? – Jens 2014-09-06 08:15:32

+1

这与'statement'的'scope'有关!请张贴相关代码来澄清更多,缩短代码不会帮助我们! – 2014-09-06 08:16:18

+0

是的,我确定添加大括号可以解决问题,是的,我已经导入了所需的类。 完整的例子: 'if(!(con == null)) Statement statement = con。createStatement();' 给出一个错误while: 'if(!(con == null)){ Statement statement = con.createStatement(); \t }' Works fine – Mickey695 2014-09-06 08:17:47

回答

7

您不能在那里声明一个变量(当前错误,来自Java 8,是error: variable declaration not allowed here)。如果你仔细想想,这是有道理的:你还没有创建一个新的范围(但是使用一个块),但是你正在创建一个情况,有时在当前范围内,将会有一个statement变量,其他时间惯于。例如:

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 ...

+2

这非常有趣,谢谢澄清@ T.J.Crowder! – Mickey695 2014-09-06 08:30:00

+1

我喜欢我从未知道这一点。我想这是以下标准的一个好处。 :) – lxcky 2014-09-06 08:32:17