簡體   English   中英

如果聲明是在主方法中進行且在循環內部進行初始化,則在Java中無法從For循環外部訪問變量嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM