Frage

Ich habe einen Konstruktor wie wie folgt:

public Agent(){

    this.name = "John";
    this.id = 9;
    this.setTopWorldAgent(this, "Top_World_Agent", true);

}

Ich erhalte eine Null-Zeiger-Ausnahme hier in dem Methodenaufruf. Es scheint zu sein, weil ich in der setTopWorldAgent Methode ‚this‘ als Argument bin mit. Durch diese Methode Entfernen ruft alles scheint in Ordnung. Warum passiert das? Hat jemand diese Erfahrung gemacht?

War es hilfreich?

Lösung

Sie können dies an Methoden übergeben, aber setTopWorldAgent () kann nicht abstrakt sein. Sie können einen virtuellen Aufruf im Konstruktor machen.

im Konstruktor eines Objekts können Sie Methoden in diesem Objekt oder Basisklassen definiert nennen, aber man kann nicht erwarten, etwas zu nennen, die von einer abgeleiteten Klasse zur Verfügung gestellt werden, da Teile der abgeleiteten Klasse nicht konstruiert sind, noch. Ich würde eine Art von Compiler-Fehler zu erwarten, wenn setTopWorldAgent () ist abstrakt.

In Java können Sie überraschendes Verhalten mit dem contructor und abgeleiteten Klassen bekommen - hier ist ein Beispiel

http://en.wikipedia.org/wiki/Virtual_functions#Java_3

Wenn Sie zu C # oder C ++ verwendet werden, könnte man denken, es ist sicher virtuellen Funktionen aufrufen und nicht überschrieben diejenigen anrufen. In Java wird der virtuelle Aufruf gemacht, obwohl die abgeleitete Klasse nicht vollständig aufgebaut ist.

Ist dies nicht, was los ist, dann vermutlich alle Teile dieser dieser setTopWorldAgent () Bedürfnisse initialisiert -. Wenn nicht, ist es wahrscheinlich eines der Mitglieder dieser, die initialisiert werden muss

Edit: dachte, das war C #

Andere Tipps

Aus Neugier, warum sind vorbei Sie ‚this‘ auf eine Elementfunktion der gleichen Klasse? setTopWorldAgent () kann ‚dies‘ direkt verwenden. Es sieht nicht wie Ihr Konstruktor oder setTopWorldAgent () sind statisch, so dass ich bin mir nicht sicher, warum Sie eine Member-Funktion etwas passieren würde es bereits Zugriff hat.

Es sei denn, ich bin etwas fehlt ...

Warum sollte setTopWorldAgent this als Argument benötigen? Basierend auf dem Aufruf, dann ist es eine Instanz-Methode, so könnte es this verweisen, ohne dass sie als Parameter erhalten.

Ich denke, mehr auf den Punkt, warum auf der Erde sind vorbei ‚this‘ als Parameter auf ein Verfahren in ‚this‘?

Sie

In der folgenden würde testen, was Sie sagen, ist dir passiert und ich habe keine Probleme mit ihm.

public class Test {
  public Test() {
    this.hi(this);
  }
  public void hi(Test t) {
    System.out.println(t);
  }

  public static void main(String[] args) throws Exception {
    Test t = new Test();
  }
}

Da setTopWorldAgent erscheint eine Instanz Methode zu sein, warum sind vorbei Sie durch diese, um es überhaupt?

"this" sollte niemals null sein. Sind Sie sicher, dass die Ausnahme, weil das geworfen wird?

Etwas zu hüten ist, dass, wenn die Methode virtuell ist, oder ruft alle virtuelle Methoden, dann ein Verfahren zu einer Unterklasse angehören könnte, bevor sich die Unterklasse der ausgeführt wird Variablen initialisiert.

Der Fehler muss woanders sein, weil der obige Code funktioniert auf jeden Fall, der NULL-Verweis etwas anderes sein muss.

Wenn Ihr Agent Umsetzung ITopWorldAgent dann sollten Sie eigentlich tun:


Agent agent = new Agent("John", 9);
agent.setTopWorldAgent(agent, "Top_World_Agent", true);

Wenn nicht, dann warum Sie etwas in der Art und Weise setzen Sie sind?

Ich nehme an, dass etwas in der setTopWorldAgent Methode einen Wert verwendet, die bisher noch nicht in Ihrem Konstruktor initialisiert hat.

this ist nicht null, so viel ist sicher. Es zugeordnet.

Das heißt, es gibt keine Notwendigkeit this in die Methode zu übergeben, ist es automatisch in allen Instanzmethoden zur Verfügung. Wenn die Methode der statischen, Sie wollen es in eine Instanz Methode Refactoring kann.

Die Regeln von Java Zustand, dass Sie sollten nie ‚dies‘ zu einem anderen Verfahren aus dem Konstruktor, aus dem einfachen Grunde passieren, dass das Objekt nicht vollständig aufgebaut war. Die Aufgabe es Verweise in einem inkonsistenten Zustand sein können. Ich bin überrascht, dass die tatsächliche ‚this‘ Referenz null ist, aber nicht überrascht, dass einige Mitglied von ‚this‘ null ist, wenn es um setTopWorldAgent übergeben wird, und dass das Verfahren, weil dieser die Ausnahme wirft.

Normalerweise kann man mit Gang weg ‚this‘ von Konstrukteuren, solange Sie tatsächlich keine Mitglieder zugreifen oder Methoden zum Beispiel aufrufen, wenn Sie einen Verweis auf ‚this‘ in ein anderes Objekt gesetzt werden soll.

In diesem Fall natürlich ist das Argument nicht notwendig, da das Verfahren bereits einen Verweis auf ‚this‘ hat.

Glad muss Ihnen eine Antwort. Ich möchte, dass die Weitergabe als Parameter ‚this‘ hinzufügen kann zu unerwarteten Parallelitätsproblemen führen. Sie sind grundsätzlich die Möglichkeit, den Zustand des Objekts bereitstellt unsafely von potenziell nicht-Thread-sicher Code manipuliert werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top