Schiffeversinken Nullpointerexeption

Barra Sargtlin

Grünschnabel
Hallo allesamt,
ich hab vor ein paar Tagen mit OO Programmierung bzw Java angefangen und bin dabei Schiffeversinken zu en. Leider hab ich ein Problem mit dem array feld_comp was sich in der gleichnamigen klasse befindet, in der funtkion abfrage. irgentwie kriege ich immer ein NullPointerException. Die variable ist privat und in allen anderen funktionen dieser klasse auch gefüllt, nur in dieser einzigen nicht... bitte um hilfe bzw erklärung.

Java:
package Schiffeversenken;
import java.io.*;

public class Main{
    public static void main(String[] args) throws IOException{        
        System.out.println("Lass uns eine Runde Schiffeversenken spielen :-) \nWie groß soll denn das Gewässer sein ?");
        Controller start = new Controller();

        start.Felder_abfrage();
        start.Felder_erstellen();
        start.Schiffe_setzen();
        
        System.out.println("Lass uns nun beginnen...");
        
        for (int i=0; i<4; i++){
            start.Zug();
            start.Feld_anzeige();
        }
    }
}

Java:
package Schiffeversenken;
import java.io.*;

class Controller{
    private int felder_width, felder_long, x, y;
    private Feld_user feld_user = new Feld_user();
    private Feld_comp feld_comp = new Feld_comp();
    
    public void Felder_abfrage () throws IOException{
        BufferedReader eingabe = new BufferedReader(new InputStreamReader(System.in));
        
        while (this.felder_width < 10 || this.felder_long < 10){
            System.out.print("Größe (mind. 10) = ");
            this.felder_width = Integer.parseInt(eingabe.readLine());
            this.felder_long  = this.felder_width;
        }
    }

    public void Felder_erstellen (){
        this.feld_user.Erstellen(this.felder_width, this.felder_long);
        this.feld_comp.Erstellen(this.felder_width, this.felder_long);
    }

    public void Schiffe_setzen (){
        this.feld_comp.Schiff_auswahl();
        System.out.println("\nOk ich hab meine Schiffe gesetzt.");
    }
        
    public void Zug() throws IOException{
        BufferedReader eingabe = new BufferedReader(new InputStreamReader(System.in));
        System.out.print("\nKoordinate x = ");
        this.x = Integer.parseInt(eingabe.readLine());
        System.out.print("Koordinate y = ");
        this.y = Integer.parseInt(eingabe.readLine());
        
        System.out.println(feld_user.Zug(this.x, this.y));
    }

    public void Feld_anzeige (){
        this.feld_user.Anzeige();
    }
}

Java:
package Schiffeversenken;

class Feld_user{
    private String[][] feld_user;
    private Feld_comp feld_comp = new Feld_comp();
    private int feld_width, feld_long;

    public void Erstellen (int feld_width, int feld_long){
        this.feld_user  = new String[feld_width][feld_long];
        this.feld_width = feld_width;
        this.feld_long  = feld_long;

        for (int vert=0; vert<this.feld_width; vert++){
            for (int hori=0; hori<this.feld_long; hori++){
                this.feld_user[hori][vert] = " ";
            }
        }
    }

    public String Zug (int x, int y){
        if (x>0 && y>0 && x<this.feld_width && y<this.feld_long){
            String testa = this.feld_comp.Abfrage(x, y);
            if (testa.equals("1")){
                this.feld_user[x][y] = "1";
                return "Treffer !";
            }
            else if (testa.equals("1")){
                this.feld_user[x][y] = "0";
                return "Daneben...";
            }
            else{
                return "Error - Feld nicht gefüllt";
            }
        }
        else{
            return "Außerhalb der Gewässer...";
        }
    }

    public void Anzeige (){
        System.out.print("x:  ");
        for (int hori=0; hori<this.feld_width; hori++){
            System.out.print(hori + " ");
        }
        System.out.println();

        System.out.print("y:|-");
        for (int hori=0; hori<this.feld_width; hori++){
            System.out.print("--");
        }
        System.out.println();

        for (int vert=0; vert<this.feld_width; vert++){
            System.out.print(vert + ".| ");
            for (int hori=0; hori<this.feld_long; hori++){
                System.out.print(this.feld_user[hori][vert] + " ");
            }
            System.out.println();
        }
    }
}

Java:
package Schiffeversenken;

public class Feld_comp{
    private String[][] feld_comp;
    private Schiffe schiffe = new Schiffe();
    private int feld_width, feld_long;

    public void Erstellen (int feld_width, int feld_long){
        this.feld_comp  = new String[feld_width][feld_long];
        this.feld_width = feld_width;
        this.feld_long  = feld_long;

        for (int vert=0; vert<this.feld_width; vert++){
            for (int hori=0; hori<this.feld_long; hori++){
                this.feld_comp[hori][vert] = "0";
            }
        }
    }

    public void Schiff_auswahl (){
        Schiff_setzen( this.schiffe.Zise("schlachter"));
    }

    public void Schiff_setzen (int schiff_zise){
        boolean ergebnis = false;

        while (ergebnis == false){
            // zufällige koords setzen
            int pos_x = (int)Math.floor(Math.random()*this.feld_width);
            int pos_y = (int)Math.floor(Math.random()*this.feld_long);
            int richtungen = 1;

            // neue richtung des punktes (gesamt 4)
            while (ergebnis == false){

                // überschreitung des punktes
                if ( (pos_x+schiff_zise) <= this.feld_width){

                    // prüfen ob auf dem feld schon ein schiff gesetzt wurde
                    for (int j=0; j < schiff_zise; j++){
                        if (this.feld_comp[pos_x+j][pos_y].equals("1")){
                            break;
                        }               
                        else if (j == (schiff_zise-1)){
                            for (int k=0; k < schiff_zise; k++){
                                this.feld_comp[pos_x+k][pos_y] = "1";
                                System.out.println( "oNe = " + (pos_x+k) + " " + pos_y);
                            }
                            ergebnis = true;
                        }
                    }
                }
                richtungen++;
                if (richtungen == 4){
                    ergebnis = true;
                }
            }
        }
    }
    
    public String Abfrage (int x, int y){
        if (this.feld_comp == null){
            return "OMG";
        }

        return this.feld_comp[x-1][y-1];
    }
}

Java:
package Schiffeversenken;

public class Schiffe
{  
    public int Zise (String typ)
    {
        int zise;
        if      (typ.equals("schlachter")) {zise = 5;} // *1
        else if (typ.equals("zerstörer"))  {zise = 4;} // *2
        else if (typ.equals("kreuzer"))    {zise = 3;} // *3
        else if (typ.equals("u-boote"))    {zise = 2;} // *4
        else if (typ.equals("sprinter"))   {zise = 1;} // *1
        else                               {zise = 0;}

        return zise;
    }
}
 
Zuletzt bearbeitet:

Barra Sargtlin

Grünschnabel
Exception in thread "main" java.lang.NullPointerException
at Schiffeversenken.Feld_user.Zug(Feld_user.java:26)
at Schiffeversenken.Controller.Zug(Controller.java:42)
at Schiffeversenken.Main.main(Main.java:19)
Java Result: 1


nachdem ich die koordinaten eingegeben habe, die dann mit der func von feld_user per x und y übergegeben werden. und eig als index dienen sollten für das array.

es liegt übrigens nicht am array, habe dies mal gewechselt und das testarray sogar in der func selber deklariert und gefüllt, kahm die gleiche meldung.
ich habe auch x und y gegen was hardcodiertes getauscht... völlig schnuppe.

/edit: ups sry, vertipps bzw net nachgedacht ^^ naja egal also bezüglich des namens
 

Anime-Otaku

Erfahrenes Mitglied
Java:
String testa = this.feld_comp.Abfrage(x, y);
Du hast das Feld feld_comp nie initialisiert.

P.S.: Gewöhne dir an gewisse Code Conventionen einzuhalten. Erleichtert das lesen. (es gibt auch java tags xD)
 

Barra Sargtlin

Grünschnabel
Java:
 public void Erstellen (int feld_width, int feld_long){
        this.feld_comp  = new String[feld_width][feld_long];
        this.feld_width = feld_width;
        this.feld_long  = feld_long;

        for (int vert=0; vert<this.feld_width; vert++){
            for (int hori=0; hori<this.feld_long; hori++){
                this.feld_comp[hori][vert] = "0";
            }
        }
}

was ist damit ? die func wird aufgerufen bevor die koords eingegeben werden
sonst würden mir die anderen func ja auch nen error schmeißen, wie zb schiffe_setzen, wo sie noch gefüllt ist. (hatte dort mal ne abfrage drinne)

wobei ich bei feld_user die var feld_comp net instanziert hatte, jetzt geht der fehler auch tiefer, wieder nach der klasse feld_comp.

mir ist aufgefallen, dass wenn ich von der schiff_setzen func die function aufrufe, macht er keine probleme... es muss also irgentwie mit dem aufruf zusammen hängen...

Exception in thread "main" java.lang.NullPointerException
at Schiffeversenken.Feld_comp.Abfrage(Feld_comp.java:62)
at Schiffeversenken.Feld_user.Zug(Feld_user.java:22)
at Schiffeversenken.Controller.Zug(Controller.java:36)
at Schiffeversenken.Main.main(Main.java:16)
Java Result: 1
 
Zuletzt bearbeitet: