2010-03-18 85 views
0

我有以下代碼:爲什麼在循環中看到一個變量,並且在循環之外沒有看到變量?

String serviceType; 
    ServiceBrowser tmpBrowser; 
    for (String playerName: players) { 
     serviceType = "_" + playerName + "._tcp"; 
     tmpBrowser = BrowsersGenerator.getBrowser(serviceType); 
     tmpBrowser.browse(); 
     System.out.println(tmpBrowser.getStatus()); 
    }  
    System.out.println(tmpBrowser.getStatus()); 

編譯器抱怨的最後一行。它寫道「變量tmpBrowser可能未被初始化」。如果我評論最後一行,編譯不會抱怨。

回答

5

如果沒有players,那麼tmpBrowser將不會以任何方式初始化。編譯器無法預測是否有玩家。另外,與字段(在方法塊外部聲明的類/實例變量)相反,局部變量(在方法塊內聲明)不會使用默認值進行初始化。你需要讓編譯器高興自己preinitializing它:

ServiceBrowser tmpBrowser = null; 

(不要忘記getStatus()前做一個nullcheck,否則你可能會冒險一NPE)。

1

如果元件在players變量的數量是零,則循環將不會被執行,因此,tmpBrowser變量將永遠不會被當執行System.out.println()呼叫初始化(甚至沒有null值)。

解決錯誤的唯一方法是給tmpBrowser變量有意義的默認(如果只甚至有null,但你仍然必須由tmpBrowser.getStatus()在這種情況下提出了NullPointerException)如果你不能得到打電話給最後的System.out.println(tmpBrowser.getStatus());

+0

它不會爲空。它將保持未初始化。這就是爲什麼它不能編譯。 – BalusC 2010-03-18 14:59:11

+0

@BalusC:我不明白你的意見。從wikipedia:在Java中,沒有顯式初始值設定項和數組元素的類和對象的字段會自動使用其類型的默認值進行初始化(布爾值爲false,所有數值類型爲0,所有參考類型爲null)。 Java中的局部變量在被訪問之前必須明確分配給它,否則就是編譯錯誤。 – LB40 2010-03-18 15:02:50

+0

@BalusC當然,代碼並不會真正運行,因此編譯錯誤,但是如果它*運行,tmpBrowser變量的值可能爲空(任何非初始化變量的值),因此編譯器錯誤。 – Peter 2010-03-18 15:02:50

1

因爲如果玩家是空集合,它確實可能未初始化。

1

如果你從來沒有進入當players數組是空的for循環說,變量tempBrowser仍將初始化。所以爲了克服這個問題,你需要確保tempBrowser有一個賦值給它的值,而不管循環如何。例如:

ServiceBrowser tmpBrowser = null; 

之前的循環將有所幫助。

相關問題