2014-09-06 59 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