2012-04-05 18 views
0

的對象我如何可以返回一個私有的內部類如何返回private內部類對象的Java

public class MainClass{ 
    public InnerClass getObj(){ 
     return this.new InnerClass() 
    } 
    private class InnerClass{ 
     InnerClass(){ 
     } 
    } 
} 
------------- 
MainClass mc = new MainClass(); 
mc.getObj(); // assume I am not holding it anywhere. 

上面的代碼是給一個空指針異常,當我與try-catch塊檢查的對象。 此外,在調試模式下嘗試時,它說「ClassNotFoundException

但我可以看到作爲MainClass $ InnerClass.class

+0

我可以看到InnerClass的構造函數沒有被調用。 我嘗試將訪問修飾符更改爲public/none,其行爲仍然相同 – sravanreddy001 2012-04-05 23:55:02

+2

getObj()的返回類型設置爲void,因此您將無法返回任何內容。正確的退貨類型應該是什麼? – 2012-04-05 23:55:36

+0

感謝您的指點,我編輯了代碼,它的InnerClass – sravanreddy001 2012-04-05 23:59:10

回答

2

嗯,我沒有同樣的問題。這裏是我的代碼的修改版本:

class MainClass { 
    public static void main(String[] args) { 
     MainClass mc = new MainClass(); 
     InnerClass ic = mc.getObj(); 
     System.out.println(ic); 
    } 

    public InnerClass getObj() { 
     return this.new InnerClass(); 
    } 

    private class InnerClass { 
     InnerClass() {} 
    } 
} 

這段代碼的結果是:

[email protected] 
+0

我不知道爲什麼它不在我的項目(小差異代碼)工作,但你的代碼時,我複製並運行,其工作正常.. 我將嘗試正確編輯問題(審查後),如果沒有。將標記你的正確。 – sravanreddy001 2012-04-06 00:07:56

+2

在這種情況下'main'可以看到'private'類型,因爲它在同一個類中。如果'main'屬於不同的類,它將* not *工作 – baruch 2014-06-17 11:52:34

0

你只是忘記您getObj方法的返回類型生成的類文件。

public InnerClass getObj(){return new InnerClass();} 
+0

編輯它,但返回新的InnerClass()將無法正常工作, this.new必須使用InnerClass()。 – sravanreddy001 2012-04-06 00:09:01

1

正如其他人已經指出,所有你需要做的是解決你的方法的返回類型。

但是,您應該知道,由於您正在使用公共方法導出非公共類型,因此您將收到警告。

+1

他抱怨NullPointerException,它不會因爲標記'void'而產生一個包含'return'的方法。這是因爲'void'/'return'衝突是一個編譯時錯誤,而NullPointerException是一個運行時異常。如果他的發佈代碼無法通過編譯時,他怎麼會得到運行時異常?直覺的答案是:他發佈了錯誤的代碼,'void'/'return'問題在他的實際代碼庫中不存在,他的問題依然存在。 :) – 2012-04-06 00:11:18

+1

完全正確!然而,隨着即將到來的大量答案的出現,我至少想提請注意這樣一個事實,即提供的示例代碼在公開API中暴露了非公共類型。如果發佈了錯誤的代碼,我們實在無法進行調試和幫助。 +1和SSCCE +1 – 2012-04-06 00:18:01

1

由於您的getObj()是公開的,因此您應該將內部類保密並返回Object,或將其公開並返回InnerClass,具體取決於您的需要。

下面的代碼示例中返回一個對象:

public class MainClass { 
     private class InnerClass { 
       InnerClass() { System.out.println("InnerClass"); } 
     } 

     public Object getObj(){ 
       return new InnerClass(); 
     } 

     public static void main (String[] argc) { 
       MainClass a = new MainClass(); 
       System.out.println(a.getObj()); 
     } 
} 

它打印出:

bash-4.2$ java MainClass 
InnerClass 
[email protected] 

正如你可以看到有與構造沒有問題。