[英]Is variable when accessed from outside the For loop is not possible in Java if declaration is done in main method & initialization inside loop?
class Myclass {
public static void main(String[] args) {
int x; // Declared in main method
if (true) {
for (int i = 0; i < 5; i++) {
x = 5;// initialized inside loop
}
}
System.out.println(x);// accessing outside for loop
}
}
這給出了一個錯誤:變量x可能尚未初始化System.out.println(x); ^ 1個錯誤;
但是,下面的代碼工作正常
class Myclass {
public static void main(String[] args) {
int x; // Declared in main method
if (true) {
x = 5;// initialized in if block
for (int i = 0; i < 5; i++) {
// x=5;
}
}
System.out.println(x);// accessing outside if loop
}
}
在這兩個代碼中,唯一的區別是在第一種情況下,變量在“ for循環”中初始化,而在第二種情況下,變量在“ if塊”中初始化。 那為什么會有所作為。 請給我解釋一下,因為我找不到真正的原因。
問題在於,編譯器在訪問x
時並不知道x
將被初始化。 這是因為編譯器不會檢查循環主體是否會實際執行(在極少數情況下,即使這樣的簡單循環也可能無法運行)。
如果條件並非始終為真,則對於if塊也是如此,即,如果您使用這樣的布爾變量:
int x;
boolean cond = true;
if( cond ) {
x = 5;
}
//The compiler will complain here as well, as it is not guaranteed that "x = 5" will run
System.out.println(x);
您作為人類會說“但是cond
初始化為true
並且永遠不會改變”,但是編譯器不確定(例如由於可能的線程問題),因此它會抱怨。 如果將cond
作為最終變量,則編譯器將知道初始化后將不允許cond
進行更改,因此編譯器可以內聯代碼以再次有效地具有if(true)
。
仍然可以訪問程序仍然有可能永遠不會訪問for塊。 由於編譯器在for循環外不滿足var的任何其他初始化要求,因此會給您一個錯誤。 為了進行編譯,您必須使用默認值初始化變量:
class Myclass {
public static void main (String[] args) {
int x = 0; // Declared in main method and init with a default value.
if(true) {
for(int i=0;i<5;i++) {
x=5;// Reinitialized inside loop
}
}
System.out.println(x); // No problems here.
}
}
在此代碼中:
公共靜態void主(String [] args){
int x; // Declared in main method
if(true)
{
for(int i=0;i<5;i++)
{
x=5;// initialized inside loop
}
}
System.out.println(x);//accessing outside for loop
}
x
僅在循環運行時設置。 編譯器認為這種可能性永遠不會發生。
在另一種情況下: if(true)
編譯器識別為“這將發生”
如果要避免這種情況,請更改
int x;
至
int x = 0; // or use another default variable
如果將if塊中的條件從true
更改為false
,則會收到與variable 'x' might not have been initialized
相同的錯誤。 當您執行if(true)
,編譯器可以理解if塊中的代碼將始終運行,因此變量x將始終被初始化。
但是,當您在for循環內初始化變量時,可能會發生for循環從未運行且變量未初始化的情況。
public static void main(String[] args) {
int x; // Declared in main method
if(false)
{
x=5; //compile error
for(int i=0;i<5;i++)
{
//x=5 initialized inside loop
}
}
System.out.println(x);
}
為了避免這種情況,將變量初始化為int x = 0;
在java for
運行時評估for
循環中,因此編譯器忽略對循環內變量初始化的檢查,這就是“ x”必須使用值初始化的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.