2012-04-05 3 views
0

Wie kann ich das Objekt von einer privaten inneren Klasse zurückgebenWie Gegenstand des privaten inneren Klassenobjekt java zurückzukehren

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. 

Der obige Code wird eine Null-Zeiger-Ausnahme geben, wenn ich mit den try-catch Blöcken geprüft. Auch wenn im Debug-Modus versucht, seine sagt ‚ClassNotFoundException

Aber ich kann die Klassendatei erzeugt, wie Mainclass $ InnerClass.class

+0

Ich kann sehen, dass der Konstruktor der InnerClass nicht aufgerufen wird. Ich habe versucht, Zugriffsmodifizierer auf public/none zu ändern, das Verhalten ist immer noch gleich – sravanreddy001

+2

Der Rückgabetyp von 'getObj()' ist auf 'void' gesetzt, sodass Sie nichts zurückgeben können. Was sollte der korrekte Rückgabetyp sein? –

+0

Danke für das Zeigen, ich bearbeitet den Code, seine InnerClass – sravanreddy001

Antwort

2

Hmmm, ich habe nicht das gleiche Problem. Hier ist meine modifizierte Version des Codes:

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() {} 
    } 
} 

Das Ergebnis dieses Codes ist:

[email protected] 
+0

Ich bin nicht sicher, warum es nicht funktioniert in meinem Projekt (wenig diff-Code), aber Ihr Code, wenn ich kopiert und lief, funktioniert es gut .. Ich werde versuchen, die Frage richtig zu bearbeiten (nach der Überprüfung), wenn nicht. .. wird deine korrigieren. – sravanreddy001

+2

In diesem Fall kann 'main' den' privaten' Typ sehen, da er in derselben Klasse ist. Wenn "main" in einer anderen Klasse wäre, würde es * nicht * funktionieren – baruch

0

Sie einfach vergessen, den Rückgabetyp Ihres getObj Methode.

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

hat es bearbeitet, aber neue InnerClass() wird nicht funktionieren, this.new InnerClass() muss verwendet werden. – sravanreddy001

1

Wie andere schon haben darauf hingewiesen, alles, was Sie tun müssen, um den Rückgabetyp Ihrer Methode zu beheben.

Sie sollten jedoch beachten, dass Sie eine Warnung erhalten, da Sie einen nicht öffentlichen Typ in eine öffentliche Methode exportieren.

+1

er klagt über eine NullPointerException, die nicht entstehen kann, wenn man 'void' eine Methode markiert, die eine 'return' enthält. Dies liegt daran, dass der Konflikt "void"/"return" ein Kompilierungsfehler ist und NullPointerException eine Laufzeitausnahme ist. Wie konnte er eine Laufzeitausnahme bekommen, wenn sein veröffentlichter Code die Compiletime nicht überstanden hat?Die intuitive Antwort lautet: Er hat den falschen Code gepostet, das Problem "void"/"return" existiert in seiner eigentlichen Codebasis nicht und sein Problem bleibt bestehen. :) –

+1

Ganz richtig! Mit der Flut von Antworten, die hereinkamen, wollte ich jedoch zumindest darauf aufmerksam machen, dass der mitgelieferte Beispielcode nicht öffentliche Typen in einer öffentlichen API offenlegt. Wir können wirklich nicht debuggen und helfen, wenn falscher Code gepostet wird. +1 für diese und +1 für SSCCE –

1

Da Ihre getObj() öffentlich ist, sollten Sie entweder die innere Klasse privat halten und eine Object zurückgeben, oder öffentlich machen und eine InnerClass zurückgeben, je nach Ihren Bedürfnissen.

Der folgende Code gibt ein Objekt in Beispiel:

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()); 
     } 
} 

Es druckt:

bash-4.2$ java MainClass 
InnerClass 
[email protected] 

Wie Sie keine Probleme mit dem Konstruktor sehen dort kann.