Test

fischebr

Mitglied
Hallo,
ich möchte mir von meinem 2D-Array eine Codierung "b0" auf der Konsole ausgeben lassen. Mein Programm kompiliert fehlerfrei, gibt aber die Werte nicht aus. Ich finde den Fehler nicht. Kann vielleicht jemand auf meinen Code schauen?

Vielen Dank!

Sorry für die Überschrift, da habe ich beim Erstellen nicht aufgepasst, finde aber auch nichts, um die Überschrift zu ändern.

Code:
public class SpielfeldPlatte {

// Eigenschaften
  int r;
  int c;
  String k;
  public String spielfeldplatte[][] = new String[r][c];

  // Konstruktor
  public SpielfeldPlatte(int r, int c, String k) {
       for (r = 0; r < spielfeldplatte.length; r++) {
            for (c = 0; c < spielfeldplatte[r].length; c++) {
                 spielfeldplatte[r][c] = k;
            }
       }
  }

  //Methoden
  void zeigeSpielfeldPlatte() {
       for(int r = 0; r < spielfeldplatte.length; r++) {
            for(int c = 0; c < spielfeldplatte[r].length; c++) {
                 System.out.print(spielfeldplatte[r][c]);
            }
            System.out.println();
       }
  }
}

Hier ist meine Main-Methode:
Code:
public class Test {

  public static void main(String[] args) {
       SpielfeldPlatte spielfeldplatte = new SpielfeldPlatte(2, 3, "b0");
       spielfeldplatte.zeigeSpielfeldPlatte();
  }
}
 
Zuletzt bearbeitet:
Dein Spielfeld wird bereits vor dem Aufruf des Konstruktors angelegt.
Den Instanzvariablen r und c werden nie Werte zugewiesen.

Du solltest dir auch überlegen, die Instanzvariablen gleich wie die Parameter im Konstruktor zu nennen. Ich vermute, dass genau das der Grund für deinen Irrtum ist.
 
Erst einmal vielen Dank für deine Antwort.
Sorry, ich weiß jetzt nicht genau was Du meinst. Das ist auch mein erstes Projekt dieser Art. Die Instanzvariablen sind doch gleich: int r, int c und String k.
Zum Anlegen des Feldes: Wenn ich das Feld im Konstruktor anlege, erhalte ich eine NPE in der Zeile, in der im Konstruktor die geschachtelte For-Schleife beginnt. Wo lege ich denn idealerweise das Spielfeld an?
In der Klasse selbst kann ich keine Werte zuweisen, weil ich die Klasse für verschiedene Größen und verschiedene Codierungen brauche.
 
Hi,
sorry für meinen vorletzten Satz. Da hat ein NICHT gefehlt.
Dein Problem beruht unter anderem darauf, dass du glaubst, dass die Instanzvariablen r und c mit den Konstruktorparametern r und c in Zusammenhang stehen.
Das tun sie aber nicht. Ich habe hier die veränderte Klasse SpielfeldPlatte.


Code:
public class SpielfeldPlatte {
 
// Eigenschaften
  public String spielfeldplatte[][];
 
  // Konstruktor
  public SpielfeldPlatte(int r, int c, String k) {
       spielfeldplatte = new String[r][c];
       for (r = 0; r < spielfeldplatte.length; r++) {
            for (c = 0; c < spielfeldplatte[r].length; c++) {
                 spielfeldplatte[r][c] = k;
            }
       }
  }
 
  //Methoden
  void zeigeSpielfeldPlatte() {
       for(int r = 0; r < spielfeldplatte.length; r++) {
            for(int c = 0; c < spielfeldplatte[r].length; c++) {
                 System.out.print(spielfeldplatte[r][c]);
            }
            System.out.println();
       }
  }
}

Die
Wie du siehst, brauchst du nur eine einzige Instanzvariable - dein Spielfeld.
Alle anderen Parameter deines Konstruktors werden nur zum Aufbau des Spielfelds benötigt und du musst sie dir nicht weiter merken.
 
Rufst du einen Konstruktor auf, so werden zuerst die Instanzvariablen deklariert/initialisert. Dann geht es erst in den Konstruktor. Bevor du nun wirklich im Konstruktor anfängst, haben deine Werte r und c noch "keine Werte", aber du erstellst dein array schon mit den Werten r und c.
Die Initialisierung des Arrays müsstest du im Konstruktor vornehmen, nachdem du r und c initialisierst.
 
Vielen Dank für Eure Antworten. Es ist echt toll, wie in diesem Forum geholfen wird. Ich habe in der Tat gedacht, dass die Konstruktorvariablen mit den Instanzvariablen in Zusammenhang stehen.

Mögt ihr mir vielleicht noch einmal weiterhelfen. Ich habe mein Programm jetzt entsprechend geändert und neu gestartet und jetzt erhalte ich eine NPE in der 26. Zeile, das ist die Zeile der "zeigeSpielfeldPlatte"-Methode, in der die verschachtelte for-Schleife beginnt.
 
Na klar, hätte ich auch selbst drauf kommen können...

Java:
public class SpielfeldPlatte {
  
// Eigenschaften
     public String spielfeldplatte[][];
  
  // Konstruktor
     public SpielfeldPlatte(int r, int c, String k) {
          String spielfeldplatte[][] = new String[r][c];
          for (r = 0; r < spielfeldplatte.length; r++) { 
               for (c = 0; c < spielfeldplatte[r].length; c++) { 
                    spielfeldplatte[r][c] = k; 
          }
     }
  }
  
  //Methoden
     void zeigeSpielfeldPlatte() { 
          for(int r = 0; r < spielfeldplatte.length; r++) {
               for(int c = 0; c < spielfeldplatte[r].length; c++) {
                    System.out.print(spielfeldplatte[r][c]);
               }
               System.out.println();
          }
     }
}

Java:
   public class Test {

        public static void main(String[] args) {
             SpielfeldPlatte spielfeldplatte = new SpielfeldPlatte(2, 3, "b0");
             spielfeldplatte.zeigeSpielfeldPlatte();
       }
}
 
Zuletzt bearbeitet von einem Moderator:
Für diese Zeile hier:
Java:
String spielfeldplatte[][] = new String[r][c];
gilt immer noch das gleiche wie für r und c:
Dein Problem beruht unter anderem darauf, dass du glaubst, dass die Instanzvariablen r und c mit den Konstruktorparametern r und c in Zusammenhang stehen.
Jetzt hast du eine lokale Variable namens spielfeldplatte, diese hat aber nichts mit der instanzvariable zu tun.

edit:
Schau dir einfach nochmal den code von @Dompteur an
 
Den "String" weglassen gab eine andere Fehlermeldung:

Code:
public class SpielfeldPlatte {
   
 // Eigenschaften
     public String spielfeldplatte[][];
   
  // Konstruktor
     public SpielfeldPlatte(int r, int c, String k) {
          spielfeldplatte[][] = new String[r][c];
          for (r = 0; r < spielfeldplatte.length; r++) {  
               for (c = 0; c < spielfeldplatte[r].length; c++) {  
                    spielfeldplatte[r][c] = k; 
               }   
          }
     }
   
  //Methoden
     void zeigeSpielfeldPlatte() {  // Konsolenausgabe Spielfeldplatte
          for(int r = 0; r < spielfeldplatte.length; r++) {
               for(int c = 0; c < spielfeldplatte[r].length; c++) {
                    System.out.print(spielfeldplatte[r][c]);
               }
               System.out.println();
          }
     }
}

Code:
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
   The left-hand side of an assignment must be a variable
   Syntax error, insert ". class" to complete Expression

   at Spielkomponenten.SpielfeldPlatte.<init>(SpielfeldPlatte.java:15)
   at Spielkomponenten.Test.main(Test.java:8)
 

Zurück
Oben