Klassen Klasse als Array im Konstruktor

Devra

Mitglied
Hallo Java-Forum-Community,
ich habe ein Problem bei folgender Aufgabe:
Wir haben eine Klasse mit folgendem Code gegeben, der nicht geändert werden darf:
Java:
public class BoardGame {
public static void main(String[] args) {
new GameFigure(1, "gruen", 4);
new GameFigure(1, "gruen", 7);
new GameFigure(2, "gelb", 2);
GameFigure.printAllFigures();
GameFigure.deleteFigure(new GameFigure(1, "gruen", 7));
GameFigure.printAllFigures();
}
}

Unsere Aufgabe ist nun die Klasse GameFigure zu implementieren, so dass eine Ausgabe wie diese ermöglicht wird:
Figure gehoert Spieler 1, ist gruen und hat 4 Ringe
Figure gehoert Spieler 1, ist gruen und hat 7 Ringe
Figure gehoert Spieler 2, ist gelb und hat 2 Ringe

Figure gehoert Spieler 1, ist gruen und hat 4 Ringe
Figure gehoert Spieler 2, ist gelb und hat 2 Ringe
Hierzu habe ich folgenden Code geschrieben:
Java:
public class GameFigure {

    int id;
    String color;
    int ring;
    int i = 0;
    static GameFigure[] figure = new GameFigure[20];
    //Vorgabe ist, das die übergebenen Variablen wie die Klassenvariablen heißen
    public GameFigure(int id, String color, int ring) {
        this.id = id;
        this.color = color;
        this.ring = ring;
        figure[i]=this;
        i++;
       
    }

    static void printAllFigures() {
    //i<1 da sonnst eine NullPointerExeption kommt
        for (int i = 0;i<1; i++) {
            System.out.println(figure[i].id + " " + figure[i].color + " " + figure[i].ring);
        }
    }
}
Wie schon im Code zu sehen ist mein Problem glaube ich, dass die Indizes des Array figure alle den Wert null haben.
Meine Fragen sind also:
Wie kann ich trotzdem auf die verschiedenen Felder des Arrays zugreifen?
Kann ich den Indizes irgendwie einen Wert zuweisen?
Gibt es bessere Lösungen in Hinsicht auf die Methode deleteFigure die ich noch Implementieren muss?

Mit freundlichen Grüßen, Devra
 

Joose

Top Contributor
Deine Schleife sollte von "i = 0" bis "i < figure.length" gehen. Wie du selbst schon bemerkt hast bekommst du dann eine NullPointerException, da nicht soviele Spielfiguren erstellt wurden.
Sprich bevor du deine Ausgabe machst musst du noch prüfen ob auf diesem Index ein Objekt vorhanden ist
Java:
if(figure[i] != null) {

EDIT:
Den entsprechenden Indexes fügst du im Konstruktor ja schon einen Wert zu, einziger Fehler dabei: die Variable "i" der Klasse GameFigure ist nicht statisch.
Jedes mal wenn du ein neues Objekt der Klasse GameFigure erstellst hat "i" den Wert 0 und wird somit auf den Index 0 im Array "figures" gesetzt.

EDIT2:
Sag dem Aufgabensteller seine GameBoard Methode ist nicht gerade das gelbe vom Ei. Auch wenn es nur ein kleines Beispiel ist, man muss Neulingen nicht so einen "Blödsinn" zeigen :p
 

Devra

Mitglied
Erstmal vielen Dank für die schnelle Antwort!
Das Problem ist wenn ich das Probiere kommt folgender Fehler:
Cannot make a static reference to the non-static field i
Wenn die Methode nicht static ist, kommt aber folgender Fehler:
Cannot make a static reference to the non-static method printAllFigures() from the type GameFigure
Wie kann ich das umgehen?
EDIT: Danke ich probiere es gleich mal mit einem static i
 

Joose

Top Contributor
Das Problem ist wenn ich das Probiere kommt folgender Fehler:
Cannot make a static reference to the non-static field i
Wenn die Methode nicht static ist, kommt aber folgender Fehler:
Cannot make a static reference to the non-static method printAllFigures() from the type GameFigure

Bei sowas dann bitte auch posten, bei welcher Zeile dieser Fehler auftritt und wie der aktuelle Code der Zeile da ausschaut. Den 2.Fehler kann ich mir denken (einfach das "static" von "printAlFigures" entfernt), aber beim 1.Fehler wüsste ich auf die schnelle nicht was du geändert hast damit dieser Fehler auftritt ;)
 

Devra

Mitglied
Erstmal vielen Dank für die schnelle Antwort!
Das Problem ist wenn ich das Probiere kommt folgender Fehler:
Cannot make a static reference to the non-static field i
Dieser Fehler tritt auf, wenn ich das if einfüge wie folgt:
Java:
static void printAllFigures() {
    if(figure[i] != null) {
        for (int i = 0;i<1; i++) {
            System.out.println(figure[i].id + " " + figure[i].color + " " + figure[i].ring);
        }
      }
    }
Ich habe jetzt den Code angepasst, in dem ich in Zeile 6 das i bei der Initialisierung static gesetzt habe und in der Methode printAllFigures das if (figure != null) implementiert habe und die Laufvariable der Schleife in j umbenannt habe, um Verwechslungen vorzubeugen.
Aussehen tut das jetzt so:
Java:
public class GameFigure {

    int id;
    String color;
    int ring;
    static int i = 0;
    static GameFigure[] figure = new GameFigure[20];

    public GameFigure(int id, String color, int ring) {
        this.id = id;
        this.color = color;
        this.ring = ring;
        figure[i] = this;
        i++;
    }

    static void printAllFigures() {
        if (figure[i] != null) {
            for (int j = 0; j < figure.length; j++) {
                System.out.println(figure[j].id + " " + figure[j].color + " " + figure[j].ring);
            }
        }
    }
}
Das gibt zwar keinen Error mehr, erzeugt jedoch auch keinerlei Ausgabe.

Edit: Ich hab es selber gelöst:
Java:
public class GameFigure {

    int id;
    String color;
    int ring;
    static int i = 0;
    static GameFigure[] figure = new GameFigure[20];

    public GameFigure(int id, String color, int ring) {
        this.id = id;
        this.color = color;
        this.ring = ring;
        figure[i] = this;
        i++;
    }

    static void printAllFigures() {
            for (int j = 0; figure[j] != null; j++) {
               
                System.out.println(figure[j].id + " " + figure[j].color + " " + figure[j].ring);
           
        }
    }
}
Vielen dank für die schnelle und geduldige Hilfe, ohne die hätte ich es nicht geschafft!
 
Zuletzt bearbeitet:

Joose

Top Contributor
Interessante Lösung ;)
Aber leider hat sie einen kleinen Denkfehler -> die Schleife läuft nur solange bis die Bedingung nicht mehr zutrifft.

Annahme du hast 3 Figuren in deinem Array "figures", somit sind figures[0], figures[1] und figures[2] belegt.
Wenn du nun das mittlere Element einfach nur aus dem Array löschen würdest, wäre figures[1] == null. Deine Schleife würde daher nur eine Ausgabe machen und den Rest ignorieren. (da die Bedingung nicht mehr erfüllt ist und die Schleife abbricht)
Lösung für das Problem: Du musst beim Entfernen eines Elements aus dem Array, alle nachfolgenden Element um 1 nach vorne rücken (leeren Platz wieder auffüllen)

Hier die Lösung mit der if-Abfrage:
Java:
static void printAllFigures() {
   for (int j = 0; j < figure.length; j++) {
     if (figure[j] != null) {
       System.out.println(figure[j].id + " " + figure[j].color + " " + figure[j].ring);
     }
   }
}
Die if-Bedingung sollte innerhalb der Schleife stehen. So wird für jeden Index geprüft ob ein Objekt vorhanden ist oder nicht. Wenn ja macht er eine Ausgabe, ansonsten nichts.
 

Neue Themen


Oben