這被看作是代碼的Java語言中的片段:分支無法通過編譯器
public void name(){
int value = 9;
int o;
if(value > 9)
o = 5;
if(value <= 9)
o = 8;
System.out.println(o);
}
爲什麼編譯器看不到第二個if語句考慮價值的最後一個選項? 它不會編譯。 最好的問候
這被看作是代碼的Java語言中的片段:分支無法通過編譯器
public void name(){
int value = 9;
int o;
if(value > 9)
o = 5;
if(value <= 9)
o = 8;
System.out.println(o);
}
爲什麼編譯器看不到第二個if語句考慮價值的最後一個選項? 它不會編譯。 最好的問候
編譯器必須把value
爲可更改。聲明它final
fixes the problem:
public void name(){
final int value = 9;
int o;
if(value > 9) o = 5;
if(value <= 9) o = 8;
System.out.println(o);
}
我很驚訝它不能輕易推測它在這種情況下是不可變的 –
@BrianAgnew我只能猜測編譯器不允許將兩個'if'中的兩個讀取值視爲訪問相同的價值(並因此使兩個條件互補)。 – dasblinkenlight
編譯器只能在檢查明確賦值時對常量表達式進行操作。 'value> 9'和'value <= 9'都不是常量表達式,除非'value'是常量變量,它本質上是一個'final'變量。 – pingw33n
在編譯:
編譯器看到的,你沒有初始化的變量的「o」,你是在系統輸出打印。
你可以做到這一點:除非你說,否則
public void name(){
int value = 9;
int o;
if(value > 9)
o = 5;
else
o = 8;
System.out.println(o);
}
初始化Ø前if語句聲明後
o=0;
原始版本無法編譯的原因是JLS section 16中的JLS'「明確分配」規則說o
尚未明確分配。編譯器用一個神祕的消息報告這個消息,說「o
可能沒有被初始化」。
現在,任何具有簡單演繹技巧的人都會看到第2個if
條件是否定第1個條件,因此該變量實際上總是會被初始化。但是,JLS不允許編譯器進行扣除。 JLS說這是一個錯誤...
有很多方法可以解決這個問題。例如
o
。if
語句替換爲單個if
/else
語句。value
爲final
。上次修復很有趣。它的工作原理是JLS明確的分配規則需要編譯器將編譯時常量布爾值表達式的值考慮在內。
本聲明(與final
加)
final int value = 9;
意味着value
是一個編譯時間常數。這意味着value <= 9
和value > 9
也是編譯時常量。因此,JLS明確分配規則指出o
之後
if(value <= 9) o = 8;
明確指定的,可沒有一個編譯錯誤以後使用。
明確賦值規則旨在防止使用未初始化的變量,並防止空白final
變量初始化一次以上。
JLS在明確賦值規則中對錶達式值的保守處理旨在避免一個Java編譯器推斷出明確賦值,但另一個不能賦值的問題。編譯時常量表達式的子表達式可以通過簡單地評估表達式來處理,並且JLS規則隱式識別這個表達式。
錯誤是:變量o可能沒有被初始化(System.out.println(o)) –
爲什麼兩個if語句而不是if..else? – CBredlow
我只是在探索語言。這兩個陳述沒有特別的理由。 – uml