Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

22.11.2011, 18:53

NullPointerException - wie?

Hallo miteinander

Ich habe bis jetzt immer in c++ entwickelt und jetzt auf java umgestiegen.

Prompt hab ich schon ein erstes Problem.
Ich will hier einen 3dimensionalen Array erstellen und dann im Konstruktor diesen gerade mit Werten füllen.

Der Compiler meldet NullPointerException. Was ist das und wieso wird das verursacht?

Das auskommentierte ist ein anderer Versuch, der aber auch nicht funktioniert.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package ch.leosworld.Millcraft;

import ch.leosworld.Millcraft.CStone;
import ch.leosworld.Millcraft.CStone.farbe;

public class CField {
    //public CStone[][][] spielfeld = new CStone[3][3][3];
    CStone spielfeld[][][];
    
    public CField(){
        spielfeld = new CStone[3][3][3];
        System.out.println("Bin jetzt im Konstruktor von CField");
        
        spielfeld[0][0][0].x = 0;
    }


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
package ch.leosworld.Millcraft;

public class CStone {
    public int x;
    public int y;
    public boolean istgelegt;
    enum farbe{blau, rot, keine};
    public farbe farbe;
}


Wahrscheinlich ist dies ein ganz kleiner Fehler, der von meiner Unerfahrenheit in Java rührt:)

lg timi19

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

22.11.2011, 18:58

Du erzeugst zwar einen neuen Array, aber keine Instanzen innerhalb des Arrays. Daher ist der Zugriff "spielfeld[0][0][0].x = 0;" im besten Fall ein Zugriff auf einen Nullpointer, im schlechtesten ein Segmentation Fault.
Auch in Java wäre der Fehler und die Ursache der/die selbe.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

3

22.11.2011, 19:01

Du erzeugst zwar einen neuen Array, aber keine Instanzen innerhalb des Arrays. Daher ist der Zugriff "spielfeld[0][0][0].x = 0;" im besten Fall ein Zugriff auf einen Nullpointer, im schlechtesten ein Segmentation Fault.
Auch in Java wäre der Fehler und die Ursache der/die selbe.

Wie meinst du das?
Keine Instanzen von CStone innerhalb des Arrays?
Wie sollte ich mein Array am besten erstellen?

Danke für deine Hilfe

4

22.11.2011, 19:09

Ich habs^^
danke dir trotzdem:)

Wirago

Alter Hase

Beiträge: 1 193

Wohnort: Stockerau

Beruf: CRM Application Manager

  • Private Nachricht senden

5

22.11.2011, 20:05

Ich habs^^
danke dir trotzdem:)

lösungen posten is ne feine sache, auch wenn man selber drauf kommt. ;)

6

22.11.2011, 20:35

Wie schon BlueCobold gesagt hat, erzeuge ich mein Array, jedoch ohne Instanzen darin.

Mit folgendem Code gehe ich mein ganzes Array durch und erstelle mir meine Steine.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class CField {
    CStone spielfeld[][][];
    
    public CField(){
        spielfeld = new CStone[3][3][3];
        
        for(int x=0; x<3; x++){
            for(int y=0; y<3; y++){
                for(int z=0; z<3; z++){
                    if(!(x == 1 && y == 1 && z == 0) && !(x == 1 && y == 1 && z == 1) && !(x == 1 && y == 1 && z == 2)){ //Ausnahme
                        spielfeld[x][y][z] = new CStone();
                    }
                }
            }
        }


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

23.11.2011, 05:58

Das IF kannst Du kürzen zu:

C-/C++-Quelltext

1
if(!(x == 1 && y == 1))


Aber final kannst Du auch alles direkt so umschreiben:

C-/C++-Quelltext

1
2
3
4
5
6
7
        for(int x=0; x<3; x+=2){
            for(int y=0; y<3; y+=2){
                for(int z=0; z<3; z++){
                    spielfeld[x][y][z] = new CStone();
                }
            }
        }
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige