2014-06-13 68 views
0

我注意到,在下面的代碼示例中,當聲明「Scanner scan」和「String [] words」時,它們被分配爲'null'。我們爲什麼需要這樣做?非常感謝您的幫助! *示例代碼旨在從文件中讀取字符串,文件的第一行是字符串的數量:int howMany。爲什麼在使用構造函數時需要分配一個空值? Java

int howMany; 
Scanner scan = null; //why do we need to assign a 'null'? 
File f; 
String[] words = null; //why not use String[] words= new String []; ? 

try { 
    f = new File(filename); 
    scan= new Scanner(f); 
    howMany = scan.nextInt(); 
    words = new String[howMany]; 

    for (int i = 0; i < howMany; i++) { 
    words[i] = scan.next(); 
    } 
} catch (IOException e) { 
    System.out.println(e); 
} 
+2

你不必這樣做,它只是一個糟糕的做法,將事情留作「默認」。明確說明通常更清楚。 – Mephy

+0

局部變量未初始化爲默認值,這會迫使您爲它們提供「已知」值以幫助防止奇怪和不可重複的結果;) – MadProgrammer

+1

在這兩種情況下,定義和初始化變量都會更有意義在代碼的稍後時間點,例如,何時知道howMany。 – EJP

回答

0

對於第一個問題,爲什麼初始化掃描儀爲空?假設你沒有。在你的代碼示例中,這沒什麼關係,但是如果你想在try塊之後,在catch或finally塊中使用Scanner對象,或者從方法中返回它呢?掃描程序可能沒有被初始化,因爲你(和編譯器)不需要知道try塊中會發生什麼,直到運行時。沒有必要將Scanner實例化爲null,它只是將IO對象實例化爲try塊之外的通用位置,因爲通常必須對try塊外的IO對象執行某些操作,即關閉它。

其次: 「爲什麼不使用String [] words = new String [];?」 因爲數組初始值設定項需要一個介於'['和']'之間的數值,並且該數值是從scan.nextInt()派生的。執行線。爲什麼它被初始化爲空? Se第一段。

在需要限制範圍之前不聲明對象是一種很好的哲學/策略,作爲擴展,直到需要時才能初始化對象。將其中任何一項預先設置爲空將導致更多的傷害而不是優點,並將您帶到NPE。 Java會默認將數組組件,類變量和實例變量初始化爲空。如果這個變量不屬於這個類別,那麼除非第一段的情況強迫你做別的事情,否則它不會被初始化,因爲編譯器會警告你它是否在沒有首先初始化的情況下使用(這對你來說是一個保護機制,開發者)

所以要回答你的問題,你不需要在給定的例子中這樣做,也可能不應該。

相關問題