2012-09-07 78 views
3

我寫了一個簡單的「在多維數組中查找數字」,它包含在官方的java教程中。這裏是教程中包含的代碼:爲什麼在Java中必須初始化嵌套循環控制變量?

class LabeledBreak { 
    public static void main(String[] args) { 
     int [][] numbers = { 
      {22, 34, 675, 23, 23}, 
      {34, 76, 98, 23, 11}, 
      {65, 234, 87, 23, 76} 
     }; 

     int searchFor = 123; 
     boolean found = false; 
     int i; 
     int j = 0; // <-- this line 

search: 
     for (i = 0; i < numbers.length; i++) { 
       for (j = 0; j < numbers[i].length; j++) { 
       if (searchFor == numbers[i][j]) { 
        found = true; 
        break search; 
       } 
       } 
     } 

     if (found == true) 
      System.out.println("Found " + searchFor + " at index " + i + ", " + j); 
     else 
      System.out.println(searchFor + " not found!!!"); 
    } 

我不明白這裏初始化「j」有什麼意義。我嘗試刪除初始化語句,並將其作爲聲明。但我得到的錯誤:

「變量j可能尚未初始化」

我爲什麼要初始化「J」?爲什麼「我」不需要初始化呢?

回答

11

那麼,如果numbers.length爲0,內循環將永不運行,因此j永遠不會被初始化,即您永遠不會到達語句j = 0;

1

考慮以下代碼:

int j = 1234567; 
int end = -100; 
for (int i = 0; i < end; i++) 
    for (j = 0; j < 10; j++) 
     System.println("Hello."); 
System.println("j is "+j); 

嘗試的end不同的值。注意輸出爲1234567

2

我不能把它放到註釋中,所以我把代碼放在這裏。

恕我直言,它最好使用結構,你不會遇到這些問題。

FOUND: { 
    for (int i = 0; i < numbers.length; i++) 
     for (int j = 0; j < numbers[i].length; j++) 
      if (searchFor == numbers[i][j]) { 
       System.out.println("Found "+searchFor+" at index "+i+", "+j); 
       break FOUND; 
      } 
    System.out.println(searchFor + " not found!!!"); 
} 

該變量的範圍限於它可以安全使用的地方。

0

爲什麼Java關心禁止讀取未初始化的變量?

這樣的代碼結構往往是非確定性的,因此很難調試,因此不可靠。此外,不加區別的堆棧內存重用可能會導致安全漏洞。

Java語言規範第16節定義了什麼使得變量「在使用前明確賦值」,主要是通過查看代碼流(語法結構),但忽略其他變量的內容(即使已知),並忽略什麼確切的方法被稱爲一路上。

但我總是初始化j

是的。但爲了證明這一點,您需要深入研究numbers的初始內容,瞭解length方法的工作方式,甚至可以排除其他線程在執行主線程時獲取對numbers的引用並修改數組的可能性。

但當found設置我不訪問j外的代碼路徑,因此,`j被初始化。

就像你說的那樣。但JLS第16章僅考慮代碼結構,而不考慮其他變量的值,例如found

爲什麼i有什麼不同?

i的初始化純粹在語法上保證是在外部循環中發生的第一件事,即使它的主體(純粹假設)根本不執行。

如果我的Java編譯器足夠聰明,看到我沒有訪問任何未初始化的變量,該怎麼辦?

就JLS第16節而言,這不會改變任何內容。您的編譯器不允許您保存在這種形式化的初始化器中,因爲該程序可能無法移植到其他Java編譯器,而這些編譯器可能不是同樣智能的。

相關問題