2017-11-15 4 views
-3

Ich versuche, auf eine Methode innerhalb einer anderen Klasse zuzugreifen, aber ich habe bereits einige Konstruktoren in der Klasse, die einen Fehler verursacht, wenn ich versuche, eine Instanz in einem anderen zu erstellen Klasse.Java-Fehler: NullPointerException wegen fehlenden Konstruktoren

EDIT: Ich weiß, ich muss einen Konstruktor ausfüllen, aber ich weiß nicht, was ich hineinlegen soll. Erstelle ich einen weiteren JFrame in der ArrayControl-Klasse oder was?

Dies ist der Fehler, den ich bekomme, wenn ich es laufen:

Exception in thread "main" java.lang.NullPointerException 
at Position.ArrayControl.updatePosition(ArrayControl.java:10) 
at Display.Display.<init>(Display.java:39) 
at Main.Game.<init>(Game.java:19) 
at Main.Launch.main(Launch.java:6) 

Dies ist, wo der Fehler passiert:

Ich versuche, den Zugang
public class ArrayControl{ 
Display display = new Display(); // Error here asking for a JFrame or String, int, int 

public void updatePosition(String name, int x, int y){ 
    display.updateGrid(name, x, y, display.getGrid()); 
    } 
} 

Die "Display" Klasse:

public class Display { 
public JPanel panel = new JPanel(); 
public ArrayControl arrayC = new ArrayControl(); 
public JFrame frame; 
JLabel[][] grid= new JLabel[5][5]; 

public JFrame getFrame() { 
    return frame; 
} 

public Display(JFrame frame){ 
    this.frame = frame; 
} 

private String title; 
private int width, height; 
Color sky = new Color(137, 182, 255); 
Color enemyPortal = new Color(154, 91, 193); 


//Creating a display function that takes in a title, the width (pixels) and height (pixels) 
public Display(String title, int width, int height){ 
    this.title = title; 
    this.width = width; 
    this.height = height; 

    createDisplay(); 
    arrayC.updatePosition("Test", 2, 3); 
} 

Ich realisiere, dass dies eine dumme Frage sein kann und die Antwort ist mir im Gesicht grell, aber alle Hilfe wird geschätzt. Danke.

+0

Sicherlich möchten Sie Ihre Instanz von Display an ArrayControl übergeben, da Sie kein anderes Display aktualisieren möchten, oder? Ich bezweifle, dass dies der Fall ist, also übergebe die aktuelle Instanz von Display mit 'this' an einen Konstruktor von ArrayControl, der ein Display-Objekt als Parameter akzeptiert und das Display-Objekt dem Array 'display' innerhalb von ArrayControl zuweist. –

+0

Ihre Annahme ist richtig! Ich möchte keine andere Anzeige aktualisieren. Ich bin nicht sicher, wie man das macht, herumspielen mit der Idee, die mir gerade Stapelüberlauffehler gab –

Antwort

0

Wie Sie identifiziert, ist der Fehler hier in Ihrer ArrayControl Klasse:

Display display = new Display(); 

Die Klasse Display nicht einen parameterlosen Konstruktor hat.

Wie jedoch aus den Kommentaren festgestellt, wird selbst reparieren dieses Programm Ihr Programm nicht reparieren.

Aktuell Ihre ArrayControl Klasse ist eine neue Instanz von Display (fälschlicherweise) Konstruieren und versucht, auf der Instanz von Display im Feld gespeichert zu aktualisieren display in Ihrer ArrayControl Klasse. Dies ist nicht das, was Sie tun möchten, sondern Sie möchten die Instanz Display aktualisieren, die das Objekt ArrayControl instanziiert hat.

Um dies zu erreichen, müssen Sie die aktuelle Instanz Display an ArrayControl übergeben, damit sie verwendet werden kann. Zum Beispiel (vereinfacht):

public class Display { 
    private ArrayControl arrayControl; 

    public Display() { 
     // Pass this instance of Display to ArrayControl to use 
     arrayControl = new ArrayControl(this); 
     arrayControl.updatePosition("Test", 2, 3); 
    } 

    public void updateGrid(String name, int x, int y) { 
     // Do update grid stuff 
    } 

} 

public class ArrayControl { 

    private Display display; 

    public ArrayControl(Display display) { 
     this.display = display; // assign instance of Display to the field display 
    } 

    public void updatePosition(String name, int x, int y) { 
     display.updateGrid(name, x, y); 
     // I'm not sure why you want to pass the display back to the 
     // Display class as in your example so I removed it 
    } 

} 

Ich bin nicht sicher, was Ihr Ziel ist größer, und warum gibt es eine ArrayControl Klasse. Ich nehme an, da ist mehr dran, von der Frage ausgeschlossen.

+0

Vielen Dank! Das hat mein Problem vollständig gelöst. Danke, dass du meine erste Frage zu StackOverflow gestellt hast! –

0

Sie erstellt einen Konstruktor

public Display(JFrame frame){ this.frame = frame; }

aber im Konstruktor (JFrame) nicht füllen, wenn ein Anzeigeobjekt zu schaffen.

+0

Ich bin mir dessen bewusst, Entschuldigung, ich habe es nicht genug erklärt, ich werde die Frage bearbeiten. Ich weiß, dass ich den Konstruktor ausfüllen muss, aber ich weiß nicht, womit ich ihn füllen soll. Erstelle ich einen ANDEREN JFrame? Das ist der Teil, auf den ich gestoßen bin. Danke für die schnelle Antwort –

0

Du arrayC.updatePosition von Display ‚s Konstruktor aufrufen, an welchem ​​Punkt arrayC.display noch null ist, weil die Instanz, dass es soll zugeordnet werden, ist, na ja, noch im Aufbau.

0

In Java wird der Standardkonstruktor (der ohne Argument) nur angezeigt, wenn kein anderer Konstruktor angegeben ist. Da Sie Ihren eigenen Konstruktor schrieb:

kann
public Display(JFrame frame){ 
    this.frame = frame; 
} 

Sie rufen nicht neue Display() jetzt. Sie können entweder:

  1. ein JFrame in ArrayControl Klasse erstellen und rufen neue Display (JFrame);
  2. Erstellen Sie einen neuen Konstruktor ohne Argumente in Display-Klasse:

    public Display() { //do nothing or maybe create JFrame here? } 
    
+0

Ich versuchte dies, aber es gab den folgenden Fehler zurück: https://pastebin.com/MMKjwAFX –

0

Wenn eine Java-Klasse, ohne erklären keine explizite Konstrukteuren geschrieben wird, ist es eine Standard hat, Konstruktor keine Argumente. Wenn jedoch mindestens ein Konstruktor explizit deklariert wird, ist der Konstruktor für kein Argument standardmäßig nicht vorhanden und muss bei Bedarf hinzugefügt werden. In Ihrem Fall haben Sie einen Display(String title, int width, int height) Konstruktor, daher muss der Konstruktor ohne Argumente bei Bedarf explizit deklariert werden.

Das heißt, Sie haben einen Konstruktor für Display Aufruf arrayC.updatePosition(), die wiederum ein anderes, eindeutiges Anzeigeobjekt erstellt. Das riecht nicht richtig. Ich vermute, Sie wollen eine einzige Display Instanz. Ich würde eine separate Methode erstellen, die die Anzeige instanziiert und dann alle anderen Objekte instanziiert, die einen Verweis darauf haben müssen, indem sie sie als Argument an ihre Konstruktoren übergeben.

+0

Verzeih mir, ich bin nicht der erfahrenste Programmierer. Ich weiß nicht genau, wie ich das machen soll, was Sie vorgeschlagen haben. Die von Ihnen erwähnte Darstellungsmethode wird in der Hauptklasse meines Programms aufgerufen. –

+0

* EDIT * Ich habe versucht, Ihren Anweisungen so gut wie möglich zu folgen. Ich habe eine separate Methode zur Instanziierung der Anzeige erstellt, alle relevanten Aufrufe aktualisiert und ich habe jetzt den Standard-Konstruktor ohne Argumente. Allerdings bekomme ich einen StackOverflow-Fehler, den Sie hier finden: https://pastebin.com/UHBL0sqC Vielen Dank für Ihre Hilfe bisher. –

+0

Sie instanziieren noch 'Position.ArrayControl' aus' Display's Konstruktor, und darin instanziieren Sie ein neues 'Display'. Wenn sowohl Display als auch ArrayControl aufeinander verweisen müssen, würde ich folgendes machen: 'myNewMethod() { Anzeige d = new Display(); –

Verwandte Themen