2016-10-05 27 views
3

這很簡單,但它變得讓我困惑,我瞭解到體範圍
破發點的第一線,但低於第1'if聲明得到錯誤(不是一個聲明)和2'nd是好的。帶或不帶「if」語句的身體範圍不同

我只是想,爲什麼會出錯?

if (true) 
    String name="Body Test"; 

而且

if (true) { 
    String name="Body Test"; 
} 

例外:

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
Syntax error, insert ":: IdentifierOrNew" to complete ReferenceExpression 
Syntax error, insert "AssignmentOperator Expression" to complete Assignment 
Syntax error, insert ";" to complete Statement String cannot be resolved to a variable 
+0

什麼是錯誤 – dahui

+0

它無法編譯。 – Vinod

+1

什麼是彙編錯誤?它不只是不編譯,它給你它不編譯的原因,並指向錯誤的行。 – dahui

回答

4

if (true) String name="Body Test";是無效的,因爲引入了新的變量納入範圍不能是有條件的,因爲它的東西,發生在編譯時間爲。請注意,Java並不足以實現if (true)總是運行。你寫的另一種方式是絕對沒問題的,因爲{}總是包含name

它有點類似於在switch塊的特定case中引入新變量,而不使用{}

+0

感謝您的一些澄清。 – Vinod

4

在您的示例中,您試圖使用guard clause聲明本地變量name。作爲Oracle文檔Local Variable Declaration Statements中說:

每一個局部變量聲明語句立即塊遏制。

而且從The if Statement ducmentation它的語法如下:

IfThenStatement: 
    if (Expression) Statement 

而在Java規範list of statements沒有聲明

並且在單語句塊(沒有大括號)的範圍內定義一個變量使得它在範圍之外無法訪問。正如你的第一種情況那樣,{}塊中沒有包含聲明,所以編譯器會給出錯誤。

這是隻有約宣言,初始化的情況下,它的工作原理:

String name;    // declaration 
if (true) 
    name = "Body Test"; // initialization (compiles okay) 

以及下面的代碼會被編譯失敗:

if (true) 
    String name;   // only declaration (compile error!) 

同時Google Java Style爲最佳練習建議使用大括號與if,else,for,dowhile陳述總是,偶數當身體是空的或只包含一個單一的陳述。大括號改善了代碼的一致性和可讀性。

+1

這裏你不回答這個問題,問題是爲什麼我們在第一種情況下得到編譯錯誤(證明它們不完全等效) –

+0

是的@Nicolas,爲什麼不能在第一種情況下創建局部變量。 – Vinod

+0

我更新了我的答案,感謝評論傢伙。 – DimaSan

0
if (true) 
    String name="Body Test"; 

上面的代碼塊拋出一個錯誤說變量聲明這裏不允許

因爲編譯器允許後只有一個聲明,如果(真),其中一個聲明是因爲變量的範圍無效。

if (true) { 
String name="Body Test"; 
} 

但在第二種情況下,有多行代碼的機會,所以沒有錯誤。

+0

第一種情況** String name =「Body Test」; **是一個語句,那麼爲什麼不聲明允許? – Vinod

+0

正如我所提到的,聲明一個變量的含義較少,因爲我們不能在代碼中進一步使用它。 您可以使用以下代碼, 字符串名稱; if(true) name =「Body Test」; – Krishas

+0

我同意你的意見,這不是進一步使用的問題。問題是,爲什麼不聲明沒有主體的聲明? – Vinod