2015-06-21 25 views
0

感謝您的閱讀不會發生編譯器錯誤,下面的代碼:爲什麼當變量被放置在類元素

public class ClassA{ 

} 
class ClassB{ 


    public String getValue() 
    { 
     ClassC classC; 
     ^^^^^^^^^^^^^  
     return classC.getValue(); 

    } 
} 

class ClassC{ 
String value; 
    public String getValue() 
    { 
    value="test"; 
      return value; 

    } 
} 

這將導致IDE響應「classC可能不會被初始化」,在編譯時。 但是,當我移動這一行:「ClassC classC;」在classB中的getVlalue()函數之外,IDE變得安靜並且拋出運行時錯誤。

任何人都可以幫忙解釋原因嗎? 非常感謝。

回答

1

這是因爲當Classc classC;移動到getValue()函數之外時,它將成爲它所在的任何類的字段.Java將自動初始化所​​有未設置的字段。在這種情況下,由於它是一個對象,它將被初始化爲null。我假設你得到的運行時錯誤是NullPointerException

當它在方法中聲明時,它不會被自動初始化,你必須明確地將它設置爲某些東西。由於在使用之前沒有這樣做,編譯器抱怨道。

+0

感謝您的幫助..這是NullPointerException異常是:) – cancerpio

1

因爲當ClassC classC;移動只是類的函數內的變量中,而不是,它成爲一個實例變量,默認情況下,當類(讀 - 對象)的實例中的所有實例變量被初始化被實例化(通過null如果沒有提供任何值,則原始類型由它們自己的不同值(例如由0等整數形成)。

此外,classC變量的值可以由同一類(包括構造函數)中的其他方法設置,如果它的公有,它的值也可以從類外部設置。

因此,根據編譯器,classC可以在訪問之前初始化,因此它不會抱怨。

+0

所以它是不同的實例和函數變量導致它......非常感謝。 – cancerpio

+0

是的,函數變量不是用'null'自動初始化的,但實例變量在創建對象時會自動初始化爲null。 –

相關問題