2016-02-01 264 views
1

示例代碼:如果陳述「不是陳述」?

public class SalCal { 
    public static void main(String[] args) { 
     int a=0; 
     if (a > 1) 
      String string = "fds";//hint:not a statement 
    } 
} 

IntelliJ IDEA的暗示String string = "fds";

不聲明

但如果我上的String string = "fds";的任意一隻手加括號,也不會提示像以前一樣了。爲什麼?

+2

的'{...}'周圍生成的聲明範圍內,因爲它代表'串串= 「FDS」;'沒什麼意思,作爲變量可以」不會被使用,只是一種閃爍和存在 – MadProgrammer

+0

該代碼是否有意義?控制將永遠不會進入如果 – Rehman

回答

6

Intellij IDEA說,因爲它不是一個聲明。這是一份聲明。

當你添加大括號,你把它變成一個塊語句......這是一個聲明。

但是,這是蹭。如果這段代碼是合法的,那就沒用了。

if (a> 1) 
     String string = "fds"; 

爲什麼?因爲聲明的範圍必須在if聲明結束時結束。你會聲明一個變量,不能使用


這裏有幾個選擇:

1)該版本聲明的變量中,如果塊

if (a> 1) { 
     String string = "fds"; 
     // you can use 'string' here 
    } 
    // ... but not here, because it is now out-of-scope. 

2)該版本聲明和if語句前初始化變量並在if中爲其分配新的值:

String string = "asdf"; 
    if (a> 1) { 
     string = "qwerty"; // assignment, not declaration 
    } 
    // OK to use 'string' here. 

@ Maroun的回答給出了你寫的東西不是有效的Java代碼的技術原因。


1 - 其實,IntelliJ IDEA的編譯器是 「鬆散的真相」。實際上,JLS稱之爲「局部變量聲明語句」。所以它在技術上是一個「聲明」......但它是一種特殊的類型,不能用於所有可以使用普通語言的語境中。

+0

你是對的。但是我擔心我不同意你的觀點「這不是一個聲明,這是一個聲明」,因爲聲明聲明也是根據[JAVA教程](https:// docs .oracle.com/javase/tutorial/java/nutsandbolts/expressions.html) – guo

+0

這不是我的觀點。我正在解釋Intellij IDEA編譯器的「觀點」。 –

0

String string = "fds";聲明與一個初始化,而不是一個聲明(如方法呼叫或分配到現有的變量)。當你使用花括號時,你需要引入一個新的塊範圍,在這個範圍內聲明塊本地變量是有意義的,但是在一個純粹的「then」中,聲明一個變量是完全沒有用的。

1

答案是在JLS - 6.1. Declarations

的局部變量,執行下列操作之一:

  • 在一個塊(§14.4

  • 本地聲明的局部變量變量聲明爲for語句(§14.14

你的情況是以上都不是,所以你得到:

error: variable declaration not allowed here 

有很多方案來解決這個:

  • 外部範圍中
  • 添加聲明string括號爲if聲明。
0

1)首先

字符串字符串= 「ASDF」;

//如果你沒有一個大括號這裏你剛剛喜歡

//所有的那些東西,是內部的,如果將按照條件

如果(A> 1)

//聲明

2)二

//你使用這些{}只是爲了阻止你的陳述 串串= 「ASDF」;

if(a> 1){//這總是一個語句;

//聲明字符串

}