NullPointerException aber warum

Status
Nicht offen für weitere Antworten.

Drake

Bekanntes Mitglied
Hallo zusammen

stehe leider vor einem Problem was sich meinem Verständniss entzieht.

Habe folgende Klasse:

Code:
public class MapData {
	public String name = "";
	public String ownerName = "";
	public int ownerId = 0;
	public int imageId = 0;
	public boolean movement = false;
	public int movePenalty = 0; //%
	public boolean wood = false;
	public boolean grain = false;
	public boolean deer = false;
	public boolean fish = false;
	public boolean wine = false;
	public boolean stone = false;
	public boolean ore = false;
	public boolean coal = false;
}

erzeuge mein Objekt und möchte darauf zugreifen:

Code:
MapData[][] mapDataTest = new MapData[10][10];
	System.out.println(mapDataTest[1][1].name);

was zur "NullPointerException" führt.

mfg
Drake
 

nEp

Aktives Mitglied
Das liegt ganz einfach daran, dass du nur ein Array selbst für die MapData Objekte erzeugt hast, aber nicht die einzelnen konkreten MapData Objekte in deinem Array.

Code:
MapData[][] mapDataTest = new MapData[10][10];
for (int i=0; i<10; i++)
   for (int j=0; j<10; j++)
         mapDataTest[i][j] = new MapData();
.....

Jetzt funktioniert das. Deine Klasse ist ausserdem aber nicht schön, und dein Array ist auch nicht gerade sinnvoll...
 

L-ectron-X

Gesperrter Benutzer
Du hast doch bisher nur ein zweidimensionales Array vom Typ MapData erzeugt und die Dimensionen festgelegt.
Da noch keine MapData-Objekte im Array abgelegt wurden, wird beim Zugriff auf einen leeres Array-Feld eine NullPointerException geworfen.
 

Drake

Bekanntes Mitglied
OK danke, Denkfehler meinerseits, ging davon aus, dass wenn ich Array daraus erzeuge die Objekte automatisch erstellt werden würden da es ja ein Array von Objekten ist.

nEp hat gesagt.:
Jetzt funktioniert das. Deine Klasse ist ausserdem aber nicht schön, und dein Array ist auch nicht gerade sinnvoll...

könntest du das bitte weiter erläutern

Ist aus meiner Sicht gar nicht so schlecht eine Map so zu verwalten.

mfg
Dake
 

Ark

Top Contributor
@Drake: Ich denke, er (sie?) meint, dass bestimmte Informationen wahrscheinlich auf die gesamte Karte zutreffen, sie aber auf jedem Feld(!) erneut gespeichert werden.

Du solltest also noch mal alle möglichen Zustände eines MapData-Objektes durchgehen und überlegen, welche Informationen wirklich nur das einzelne Feld betreffen, und vor allem, ob alle boolean-Werte zugleich true sein können (oder ob doch immer nur einer von diesen boolean-Variablen zu einer Zeit auf true gesetzt ist).

MfG
Ark
 

Drake

Bekanntes Mitglied
Ark hat gesagt.:
Ich denke, er (sie?) meint, dass bestimmte Informationen wahrscheinlich auf die gesamte Karte zutreffen, sie aber auf jedem Feld(!) erneut gespeichert werden.

Jeder Eintrag im Array steht für ein Hex-Feld. Aus diesem Array lasse ich Karte(nausschnitte) zeichnen. Einige zusammenhängende Flächen haben natürlich so gut wie die gleichen Werte, doch alles in allem schaut die engültige Karte schon sehr vielfältig aus.

Somit erscheint das mir die komfortabelste Methode, da ich aus jedem Feld alles und nichts machen kann. Dieses hat aus meiner Sicht den Vorteil, dass obwohl ca. 80% Prozent der Karte aus strd. Feldern bestehen (Felder, Berge, ect.) ich die Möglichkeit habe, 'special Felder' mit belibiegen Eigenschaften zu definieren.

Zurzeit mache ich noch meinen Mapeditor fertig, um mich dann weiter dem eigentlichen Spiel zu widmen.

Das ist mein Gedankengang dazu, wobei ich mich über Kritik (pos. wie auch neg.) dessen freuen würde.

mfg
Drake
 

Ark

Top Contributor
Drake hat gesagt.:
Code:
public class MapData {
	public String name = "";
	public String ownerName = "";
	public int ownerId = 0;
	public int imageId = 0;
	public boolean movement = false;
	public int movePenalty = 0; //%
	public boolean wood = false;
	public boolean grain = false;
	public boolean deer = false;
	public boolean fish = false;
	public boolean wine = false;
	public boolean stone = false;
	public boolean ore = false;
	public boolean coal = false;
}
1. Alle Eigenschaften sollten private (oder protected) sein.
2. Welche Werte können movePenalty, ownerId und imageId annehmen?
3. Gibt es einen Zusammenhang zwischen ownerId und imageId?
4. Gibt es einen Zusammenhang zwischen movePenalty und movement?
5. Die Eigenschaften wood, grain, deer, fish, wine, stone, ore und coal solltest Du alle in einem Byte unterkriegen. Da ein boolean 1 Byte belegt, ist es ziemlich kostspielig, mehrere boolean-Werte in zu verwenden, wenn hunderte Objekte dieser Art angelegt werden.

Hier mal mein Vorschlag dazu:
Code:
public class MapData {
	private static final byte WOOD = 1;
	private static final byte GRAIN = 2;
	private static final byte DEER = 4;
	private static final byte FISH = 8;
	private static final byte WINE = 16;
	private static final byte STONE = 32;
	private static final byte ORE = 64;
	private static final byte COAL = -128;

	private String name = "";
	private String ownerName = "";
	private int ownerId = 0;
	private int imageId = 0;
	private boolean movement = false;
	private int movePenalty = 0; //%
	private byte set = 0;
}
Aus den booleans habe ich set gemacht. Hier eine Skizze zur Verwendung (falls Dir Binärarithmetik nicht geläufig sein sollte):
Code:
// Eigenschaft WOOD setzen
set |= WOOD;

// Eigenschaft WOOD löschen
set &= ~WOOD;

// auf WOOD testen
if((set & WOOD)!=0) …

// auf nicht-WOOD testen
if((set & WOOD)==0) …

// auf nur-WOOD testen
if(set==WOOD) …

// usw.
Ich hoffe, ich bin nicht zu kleinlich. ^^

MfG
Ark

EDIT:
Noch etwas: Hat diese Klassen eigentlich auch Methoden? Oder soll sie nur die Daten bereithalten? Wenn Letzteres zutrifft, sollten die Eigenschaften in der Klasse doch public sein, aber die Klasse selbst sollte innerhalb einer anderen liegen und selbst private (und static) sein, etwa so:
Code:
public class MyMap{
	private static class MapData {
		public static final byte WOOD = 1;
		public static final byte GRAIN = 2;
		public static final byte DEER = 4;
		public static final byte FISH = 8;
		public static final byte WINE = 16;
		public static final byte STONE = 32;
		public static final byte ORE = 64;
		public static final byte COAL = -128;

		public String name = "";
		public String ownerName = "";
		public int ownerId = 0;
		public int imageId = 0;
		public boolean movement = false;
		public int movePenalty = 0; //%
		public byte set = 0;
	}
}
Na ja, um die richtige Struktur auszuwählen, müsste man jetzt mehr Informationen darüber haben. Dennoch seien die genannten Dinge zumindest als Denkanstoß zu sehen. ;)

MfG
Ark
 
G

Gast

Gast
statt dem set lieber ein enum benutzen, ist viel besser zulesen
 

Drake

Bekanntes Mitglied
Danke werde mir das gleich in Ruhe durch den Kopf gehen lassen, möchte jetzt aber schon mal auf deine Punkte eingehen.

1. Alle Eigenschaften sollten private (oder protected) sein.
2. Welche Werte können movePenalty, ownerId und imageId annehmen?
3. Gibt es einen Zusammenhang zwischen ownerId und imageId?
4. Gibt es einen Zusammenhang zwischen movePenalty und movement?
5. Die Eigenschaften wood, grain, deer, fish, wine, stone, ore und coal solltest Du alle in einem Byte unterkriegen. Da ein boolean 1 Byte belegt, ist es ziemlich kostspielig, mehrere boolean-Werte in zu verwenden, wenn hunderte Objekte dieser Art angelegt werden.


zu:
1 Ja, die Klasse soll wirklich nur die Daten beinhalten, darum habe ich der einfachheit halber auf getter und setter verzichtet, was ehrlich gesagt wirklich nur aus Faulheit geschehehen ist. Den Sinn die Klasse public in eine private zu packen erkenne ich jetzt noch nicht (fehlt wohl noch meine min. Kaffeedosis / Morgen)

2. movePenalty muss wirklich ein int sein, da ich einen Wertebereich von 0 - 999 haben möchte
ownerId ist auch einen großen Wertebereich angewiesen, für imageId dagegen sollte ein byte komplett ausreichen

3 nein, ownerId ist der User, dem das Feld 'gehöhrt', imageId beschreibt durch welches Bild das Hexfeld dargestellt wird

4 auch optimierbar, wenn man sich auf / durch das Feld nicht bewgegen kann, ist es unwichtig was für einen Abzug das Feld verursacht auf die strd. Bewegung pro Zeiteinheit

5 die Idee hat was
oder sagen wir mal ist ein verdammt guter Vorschlag zur Optimierung, diese Werte in ein byte zu packen und einfach auszuwerten welche bits alles gesetzt sind um daraus dann auf die Eigenschaften zu schließen, im best case wird so nur ein achtel des Speichers benötigt, was bei einer großen Map doch sehr viel ausmacht.

Keine Sorge, wenn ich das so sehe leuchtet es mir auch ein, obwohl ich beim 'mich rein denken' doch kurz überlegen musste, warum -128, bis ich doch die Stimme in meinem Kopf nicht mehr leugnen konnte, die versuchte mir einzuhämmern, erstes bit gesetzt => negativ, erstes bit gesetzt => negativ :D

Dein Gedankengang ist auf jedenfall eine Hilfe, und leider kann man streng genommen nicht kleinlich genug.

Jetzt muss ich aber erst einmal neuen Kaffe besorgen.

mfg
Drake
 

Ark

Top Contributor
Ich kenne mich mit enums für diese Zwecke nicht aus. *zugeb* Wie sieht das denn dann aus?

EDIT:
Eine Eigenschaft eines Objektes sollten immer direkt oder indirekt private (oder protected) sein, es sei denn, jede Klasse bzw. Instanz darf zu jeder Zeit dieser Eigenschaft jeden ihr möglichen Wert (festgelegt durch den Datentyp und die Sprachspezifikation) zuweisen. (Das dürfte wohl recht selten der Fall sein. ;) )

Ansonsten sieht es bis jetzt so aus:
Für movement gilt also zu jeder(!) Zeit
Code:
movement == (movePenalty!=0)
richtig?

Für movePenalty sollte ein short genügen. Frage: Reicht ein short (-32768 - 32767) auch für ownerId und/oder imageId?

Gibt es sonst noch irgendwelche Zusammenhänge zwischen den Daten (z. B. zwischen imageId und der von mir vorgeschlagenen Variable set)?
 

Drake

Bekanntes Mitglied
Ark hat gesagt.:
Ansonsten sieht es bis jetzt so aus:
Für movement gilt also zu jeder(!) Zeit
Code:
movement == (movePenalty!=0)
richtig?

nicht ganz, movementPenalty ist ein Prozentsatz um den sich die Bewegungszeit erhöht, movementPenalty = 0 sollte eigentlich bedeuten, dass bei Bewegung über das Feld sich die benötigte Zeit um 0% erhöht.

Wobei der Ansatz natürlich auch was hat, somit bestünde zwar immer eine Verzögerung von einem Prozent, aber wenn die Verzögerung 0% wäre, würde daraus folgen Bewegung auf diesem Feld nicht möglich, spart somit ein weiteres byte.

Ich gebe zu, ich weiss auch nicht was mich geritten hat in der MapData Klasse alles public zu machen.

imageId steht in keiner Beziehung zum Rest, den optischen Hintergrung weise ich im Mapeditor zu, jedoch können Felder mit den gleichen Werten durchaus unterschiedliche Hintergrundbilder haben, je nach dem welche Felder um sie herum sind.

Ja, short wäre für imageId wohl der geeigneste Datentyp, ownerId muss aber int bleiben, kann dir den Sinn dessen aber nur in einer pn erläutern.

Doch leider habe ich anscheinend zur Zeit keinen Kopf für die passenden Datentypen, liegt daran, dass ich für meine Grundlagen der Algorithmen und Datenstrukturen Klausur am Do am lernen bin und in meinem Kopf die verschiedensten Sortieralgorithmen mit Laufzeiten rum spucken gepaart mit Bäumen.
 

Ark

Top Contributor
Wenn also doch kein wirklicher Zusammenhang zwischen movePenalty und movement besteht, kannst Du movement zumindest wie folgt verbauen, um kein Byte extra dafür zu verbraten:
Code:
private static final short MOVEMENT = 16384;
private static final short MOVE_PENALTY = 16383;

private short moveAndPen = 0;

// Es gelten:
// movement == moveAndPen & MOVEMENT
// movePenalty == moveAndPen & MOVE_PENALTY
Mit anderen Worten: Das oberste Bit von moveAndPen wird als movement-Ersatz benutzt, die unteren 15 Bits als movePenalty. Dies ist recht einfach möglich, da ja movePenalty nie negativ wird. ;)

Das Vorgehen zum Testen auf movement ist äquivalent zu dem, was ich oben bereits beschrieb. Du musst nur beachten, dass Du für movePenalty immer moveAndPen & MOVE_PENALTY angibst!

MfG
Ark
 

Drake

Bekanntes Mitglied
Ok

dadurch kann ich meine MapData doch sehr schön optimieren, muss mich zwar was die lesbarkeit immer wieder reindenken, aber das ist es Wert, da so mehr als die Hälfte des Speichers eingespart wird, danke dir.

mfg
Drake
 

Ark

Top Contributor
@Drake: Hoffentlich guckst Du trotz Paranoia auch ab und zu in Dein PN-Fach. ;)

MfG
Ark
 

Drake

Bekanntes Mitglied
Bin doch auch nur ein kleiner Student der nebenbei noch arbeiten geht, bitte nicht übel nehmen, kann doch nichts dafür, dass ich noch kein passendes Mittel gegen dieses merkwürdige "Schlaf-Phänomen" gefunden habe :) ,
aber ich arbeite dran :lol:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
H NullPointerException, aber wieso? Java Basics - Anfänger-Themen 5
F java.lang.NullPointerException, kann aber nicht sein! Java Basics - Anfänger-Themen 4
W Compiler-Fehler NullPointerException. Aber wieso? Java Basics - Anfänger-Themen 2
T Compiler-Fehler NullpointerException - Wert kann aber ausgelesen werden Java Basics - Anfänger-Themen 2
N NullPointerException aber warum? Java Basics - Anfänger-Themen 10
S nullpointerexception. aber warum ? Java Basics - Anfänger-Themen 3
F NullPointerException aber warum? Java Basics - Anfänger-Themen 23
C NullPointerException, aber nichts darf null sein? Java Basics - Anfänger-Themen 7
M NullPointerException: Cannot read the array length because "this.Kinder" is null Java Basics - Anfänger-Themen 1
H Liste Knoten NullPointerException Java Basics - Anfänger-Themen 7
C Compiler-Fehler NullPointerException Java Basics - Anfänger-Themen 10
LePetitChat1 Arrays - NullPointerException? Java Basics - Anfänger-Themen 14
berserkerdq2 Nullpointerexception, obwohl ich Array initialisiere? Java Basics - Anfänger-Themen 1
U Warum gibt das eine Nullpointerexception? (Switch) Java Basics - Anfänger-Themen 6
missy72 Klassen Objekt Array NullPointerException Java Basics - Anfänger-Themen 3
Jose05 Nullpointerexception Java Basics - Anfänger-Themen 7
emx-zee Erste Schritte NullPointerException, Array mit zufälligen Zahlen füllen Java Basics - Anfänger-Themen 2
Jose05 Nullpointerexception bei Umwandlung von String zu int Java Basics - Anfänger-Themen 2
H Java NullPointerException Java Basics - Anfänger-Themen 4
YaU Vererbung erstellt NullPointerException? Java Basics - Anfänger-Themen 4
D Hilfe beim Erzeugen eines Arrays NullPointerException wird ausgelöst Java Basics - Anfänger-Themen 11
L Threads Komischer NullPointerException Java Basics - Anfänger-Themen 2
H Fehler: NullPointerException und ich weiß net warum Java Basics - Anfänger-Themen 4
F Fehlermeldung java.lang.NullPointerException Java Basics - Anfänger-Themen 4
Avalon NullPointerException beim Mocken Java Basics - Anfänger-Themen 6
D NullPointerException in foreach loop Java Basics - Anfänger-Themen 1
D java.lang.NullPointerException Java Basics - Anfänger-Themen 19
T Bufferedwriter code Nullpointerexception Java Basics - Anfänger-Themen 4
D NullPointerException im Array Java Basics - Anfänger-Themen 4
X java.lang.NullPointerException fehler ? Java Basics - Anfänger-Themen 1
B java.lang.NullPointerException bei javafx Java Basics - Anfänger-Themen 10
J NullPointerException beim Klonnen eines Arayys und beim aufrufen einer Methode Java Basics - Anfänger-Themen 2
V NullPointerException Java Basics - Anfänger-Themen 2
S NullPointerException während ResultSet Java Basics - Anfänger-Themen 7
V NullPointerException, wenn Key und Value null sind Java Basics - Anfänger-Themen 2
scratchy1 NullPointerException Java Basics - Anfänger-Themen 19
U Was löst meine NullPointerException aus? (Vererbung) Java Basics - Anfänger-Themen 12
F Wie kann ich diese NullPointerException umgehen?! Java Basics - Anfänger-Themen 41
dapzoo Compiler-Fehler Beim Werte verteilen in Objektarray NullPointerException Java Basics - Anfänger-Themen 4
W Optional<T> - NullPointerException Java Basics - Anfänger-Themen 37
Jascha NullPointerException vs NumberFormatException Java Basics - Anfänger-Themen 5
L Variablen NullPointerException bei Dateigröße (Nr.1) Java Basics - Anfänger-Themen 4
M Compiler-Fehler NullPointerException Java Basics - Anfänger-Themen 13
D NullPointerException umgehen Java Basics - Anfänger-Themen 17
Z Objekt Array führt zum NullPointerException Java Basics - Anfänger-Themen 2
W NullPointerException obwohl nicht null? Java Basics - Anfänger-Themen 3
W ArrayList NullPointerException Java Basics - Anfänger-Themen 4
A NullPointerException Java Basics - Anfänger-Themen 6
S NullPointerException Java Basics - Anfänger-Themen 4
T OOP Wörterbuch NullPointerException Java Basics - Anfänger-Themen 4
R Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 10
O NullPointerException Java Basics - Anfänger-Themen 2
M Interpreter-Fehler Feld NullPointerException Java Basics - Anfänger-Themen 4
L Variablen Unerklärliche NullPointerException Java Basics - Anfänger-Themen 2
E Compiler-Fehler nullPointerException in verschachteltem Modell Java Basics - Anfänger-Themen 6
DaCrazyJavaExpert Threads NullPointerException Java Basics - Anfänger-Themen 8
DaCrazyJavaExpert Compiler-Fehler Variable nicht mit null initialisiert, trotzdem: NullPointerException Java Basics - Anfänger-Themen 28
kodela NullPointerException Java Basics - Anfänger-Themen 12
R Taschenrechner NullPointerException Java Basics - Anfänger-Themen 1
H java.lang.NullPointerException Java Basics - Anfänger-Themen 4
H NullPointerException obwohl Objekt angelegt wurde Java Basics - Anfänger-Themen 1
A Threads Reentrantlock | NullpointerException möglicher Deadlock? Java Basics - Anfänger-Themen 0
K Compiler-Fehler NullPointerException lösen Java Basics - Anfänger-Themen 16
G java.lang.NullPointerException Java Basics - Anfänger-Themen 3
P Compiler-Fehler NullPointerException Java Basics - Anfänger-Themen 1
E Compiler-Fehler java.lang.NullPointerException Java Basics - Anfänger-Themen 2
S Methoden Methode funktioniert nicht | NullPointerException Java Basics - Anfänger-Themen 6
F NullpointerException bei zweidimensionalem Array Java Basics - Anfänger-Themen 2
Z OOP - Array ständig NullPointerException Java Basics - Anfänger-Themen 4
J Verstehe die NullPointerException nicht Java Basics - Anfänger-Themen 1
T Nullpointerexception und es wird nichts angezeigt Java Basics - Anfänger-Themen 15
B ProcessMessage NullPointerException Java Basics - Anfänger-Themen 11
shiroX Compiler-Fehler NullPointerException Java Basics - Anfänger-Themen 9
MrSnake ItemListener mit NullPointerException Java Basics - Anfänger-Themen 3
J java.lang.NullPointerException in meiner JavaFXControllerKlasse Java Basics - Anfänger-Themen 26
M NullPointerException Java Basics - Anfänger-Themen 8
B Vererbung NullPointerException Java Basics - Anfänger-Themen 38
D Communications link failure | java.lang.NullPointerException Java Basics - Anfänger-Themen 3
G NullPointerException Java Basics - Anfänger-Themen 1
J NullpointerException Java Basics - Anfänger-Themen 1
M Interpreter-Fehler Nullpointerexception trotz Ordentlicher Initialisierung Java Basics - Anfänger-Themen 4
M String-Vergleich und NullPointerException Java Basics - Anfänger-Themen 4
D Java Fehler: NullPointerException Java Basics - Anfänger-Themen 1
M Vergleich zweier Array Stellen mit equals/NullpointerException Java Basics - Anfänger-Themen 9
X Problem mit NullPointerException Java Basics - Anfänger-Themen 2
K NullPointerException in der Hashtable Java Basics - Anfänger-Themen 4
S Interpreter-Fehler Hilfestellung bei einer NullPointerException Java Basics - Anfänger-Themen 1
S GraphNode --- Dijkstra Algorithmus : NullPointerException Java Basics - Anfänger-Themen 1
L NullPointerException Java Basics - Anfänger-Themen 11
M Nullpointerexception??? Java Basics - Anfänger-Themen 2
W NullPointerException bei DefaultListModel Java Basics - Anfänger-Themen 5
N NullPointerException bei Konsolenausgabe Java Basics - Anfänger-Themen 5
J Klasse in Klasse; NullPointerException Java Basics - Anfänger-Themen 8
R NullPointerException wegen JPanel oder doch nicht ? Java Basics - Anfänger-Themen 7
Q NullPointerException Java Basics - Anfänger-Themen 5
H NullPointerException Java Basics - Anfänger-Themen 5
T Threads MultiThreading NullPointerException Java Basics - Anfänger-Themen 7
K NullPointerException wird geworfen, bitte um Hilfe! Java Basics - Anfänger-Themen 7
O Objekt weitergeben Meth Class NullPointerException Java Basics - Anfänger-Themen 2
J Char-Array - NullPointerException Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben