2013-06-20 72 views
-3
## Class B ## 
    public class ClassB{ 

    public ClassB() { 
    } 

    public String getAddress() { 
     return "Address"; 
    } 
     } 

## Class A ## 
    public class ClassA{ 
    private ClassB classb; 

    public ClassA() { 
    } 

    public void setClassb(ClassB classb) { 
    this.classb = classb; 
} 
    public void getAddress() { 
     System.out.println(classb.getAddress()); 
    } 
     } 

## Main Class ## 
     public class MainClass{ 

    public static void main(String[] args){ 
     ClassA classa = new ClassA(); 
     classa.getAddress(); 
    }} 


---------- 

當我運行這個程序時,它返回空指針異常。有人可以向我解釋Nullpointer異常的原因嗎?謝謝。我嘗試過使用setter方法,但仍然拋出nullpointer異常在java中引發空指針異常

+0

我寧願您關閉這個問題,因爲這可能會成爲本網站上小觀衆。 – Mordechai

+0

您還沒有創建'classB'對象。你剛剛宣佈它。 –

回答

1

classb只是一個參考變量,它指向一個對象。爲了得到任何東西從ClassB的做,你首先需要創建一個類的對象如下圖所示

解決方案1:

//initialize at the time of declaration 
private ClassB classb = new ClassB(); 

解決方案2:

//provide a setter method: 
private ClassB classb; 
public void setClassb(ClassB classb) 
{ 
    this.classb= classb; 
} 

編輯

您的主類

,而不是這些語句:

ClassA classa = new ClassA(); 
    classa.getAddress(); 

嘗試用以下語句:

ClassA classa = new ClassA(); 
    classa.setClassb(new ClassB());//new statement to be inserted! 
    classa.getAddress(); 
+0

解決方案2: //提供setter方法: private ClassB classb; 這是構造函數還是setter方法? public setClassB(ClassB classb) { this.classb = classb; } – gjman2

+0

這是一個setter方法,不是構造函數。我的錯。我編輯了代碼。 – codeMan

+0

你的解決方案2是構造函數還是setter方法? Setter方法必須具有void的返回類型嗎? – gjman2

1

ClassA內部的classB實例未被投入。

你必須創建ClassA的實例

public class ClassA{ 
private ClassB classb; 

public ClassA() { 
    classb = new ClassB() 
} 

public void getAddress() { 
    System.out.println(classb.getAddress()); 
} 
} 
1

classb當你ClassA聲明實例化ClassB的,但它沒有初始化,所以當你嘗試classb.getAddress(),你會得到一個NullPointerException。您可以在構造函數初始化它ClassA

public ClassA() 
{ 
    classb = new ClassB(); 
} 
1

修復這個由:

public class ClassA{ 
    private ClassB classb = new ClassB(); //initialize 

    public ClassA() { 
    } 

    public void getAddress() { 
     System.out.println(classb.getAddress()); 
    } 
    } 
0

正如其他人所說,這是由於classa不是你classb成員正在初始化。要解決這個問題,可以在初始化ClassA對象時初始化它,或者由於您從ClassB的getAddress()方法返回靜態值,請將ClassB的getAddress()方法設置爲靜態,不要打擾初始化ClassB對象,並從ClassA的getAddress()方法靜態引用ClassB的getAddress()方法。

實施例:

// Class B 
public class ClassB 
{ 
    public ClassB() 
    { 
    } 

    public static String getAddress() 
    { 
     return "Address"; 
    } 
} 


// Class A 
public class ClassA 
{ 
    public ClassA() 
    { 
    } 

    public void getAddress() 
    { 
     System.out.println(ClassB.getAddress()); 
    } 
} 


// Main Class 
public class MainClass 
{ 
    public static void main(String[] args) 
    { 
     ClassA classa = new ClassA(); 
     classa.getAddress(); 
    } 
}