2017-08-28 15 views
-2

我的代碼創建Java對象:使用組成

public class Class1 { 

    Class2 class2; 

    public Class1(Class2 class2) { 
     class2 = new Class2(); 
    } 

    public void print() { 
     class2.printMe(); 
    } 
} 

public class Class2 { 

    public void printMe() { 
     System.out.println("Hi"); 
    } 

} 

打印方法拋出空指針,因爲沒有創建的Class2對象。 此外,我不想在構造函數中創建一個對象 - 我想使用DI,但我並沒有意識到它。

+0

我們需要多一點的代碼......你如何使用這些類? –

+0

準確地說,你的問題是什麼,儘量做到儘可能具體 –

+0

我看不出NPE在這裏是怎麼可能的。 –

回答

0
public class Class1{ 
    Class2 class2; 

    public Class1(Class2 class2){ 
    this.class2=class2; 
    } 

} 

這就是使用構造函數的依賴注入的樣子。

+0

謝謝,但它不工作。 2017-08-28 14:29:08,602錯誤Class1.java:36 - 錯誤: java.lang.NullPointerException –

+0

上面一個是你的完整代碼?如果沒有,請發佈完整的代碼。 –

0

正如Tom暗示的那樣,你並沒有在構造函數中爲該字段寫一個值。相反,你忽略了作爲參數給出的實例(如果正確完成,它看起來像是一種做DI的方式!),並用新實例覆蓋參數變量。但是,這並不影響該領域。

嘗試使用此構造函數來代替:

public Class1(Class2 class2) { 
    this.class2 = class2; 
} 
+0

我試過這個,但它拋出空指針,因爲我沒有在我的代碼中的任何地方創建Class2的實例。 –

1

您重新分配在Class1構造函數的參數。您需要將其分配給您的class2字段。有兩種方法來解決這個問題:

  1. 刪除參數:

    public class Class1 { 
    
        Class2 class2; 
    
        public Class1() { 
         class2 = new Class2(); 
        } 
    
        public void print() { 
         class2.printMe(); 
        } 
    } 
    
  2. this分配到正確的領域:

    public class Class1 { 
    
        Class2 class2; 
    
        public Class1(Class2 class2) { 
         this.class2 = class2; 
        } 
    
        public void print() { 
         class2.printMe(); 
        } 
    } 
    
+0

我確實嘗試過。但是,我將如何獲得2類對象?我從來沒有在任何課堂上初始化它。 –

+0

@RishabhJain當你實例化Class1時,你會這樣做:'Class1 fred = new Class1(new Class2())' – scrappedcola

0

如果有含糊不清一個變量名(在你的情況下,它可以指向方法參數以及實例字段),你需要添加「this」來指出你指的是哪一個。否則,它會指向方法參數。

public Class1(Class2 class2) { 
    this.class2 = class2; 
} 

^這將解決您的問題。