Interpreter-Fehler Null?

Xandaros

Mitglied
Hallo!
Ich bezeichne mich selbst zwar nicht als Anfänger. fühle mich aber gerade wie einer, deswegen poste ich hier.

Folgendes:
Ich habe eine abstrakte Klasse A, die ungefähr so aufgebaut ist:

Java:
public abstract class A
{
	public A()
	{
		this.onInit();
	}

	public abstract void onInit();
}

Und eine Klasse B, die A erweitert mit einer ArrayList als feld darin:

Java:
public class B extends A
{
	public static ArrayList<C> liste = new ArrayList<C>(15);

	public B()
	{
		super();
	}

	public void onInit()
	{
		liste.add(new C());
	}
}

In Zeile 12 von Klasse B bekomme ich eine NullPointerException.
Durch eine simple if-Abfrage habe ich bereits bestätigt, dass liste an der Stelle null ist.

Jetzt meine große Frage: Warum?
 
Zuletzt bearbeitet:

Xandaros

Mitglied
Felht da nicht ein extends A bei der Klasse B ? :D

Das ist zwar richtig, ist aber nicht das Problem :D

Nein, der Fehler tritt so bei dem Code mit Sicherheit nicht auf.

Ich würds auch nicht glauben, wenns nicht so wäre -_-

Ich geb euch mal den echten Code, ist aber wahrscheinlich schwerer zu lesen:

Java:
public abstract class NeoScreen extends GenericPopup
{
	//Hier fehlen natuerlich noch ein paar sachen
	public NeoScreen(SpoutPlayer player)
	{
		width = player.getMainScreen().getWidth();
		height = player.getMainScreen().getHeight();
		
		this.player = player;
		
		this.onInit();
	}

	//Und hier sind auch noch ein paar unwichtige methoden

	public abstract void onInit();
}

Java:
public class GuiNPC extends NeoScreen
{
	private ArrayList<Label> messages = new ArrayList<Label>(15);
	
	//Weitere deklarationen

	public GuiNPC(SpoutPlayer player)
	{
		super(player);
	}

	@Override
	public void onInit()
	{
		addButton(0, (width - 73)/2, (height + 166)/2, 75, 10, "Close");
		for (int i = 0; i < 15; i++)
		{
			Label label = addLabel(0, 0, "");
			label.setX((width - GenericLabel.getStringWidth(label.getText())) / 2);
			label.setY(height / 6 + i * 10);
			messages.add(label); //Hier kommt die exception
		}
	}

	//Weitere methoden
}

Achja, der fehler kommt beim Instanzieren von B bzw. GuiNPC
 

eRaaaa

Top Contributor
Hier ist messages / deine Liste ja auch nicht statisch, das ist ein ganz anderes Beispiel jetzt. Du rufst hier schon Methoden auf (init) und dein Objekt ist noch nicht einmal instanziiert 100%. Das ist unschön!
 
G

Gast2

Gast
eRaaaa hat schon die Lösung gepostet!
Das Objekt ist noch nicht vollständig initialisiert wenn du die Methode onInit aufrufst. Als Faustregel: im Konstruktor nie nicht-finale Methoden aufrufen. Speziell wenn die Klasse abgeleitet wird.
 

Xandaros

Mitglied
Hier ist messages / deine Liste ja auch nicht statisch, das ist ein ganz anderes Beispiel jetzt.

Ouch, da bin ich mit einem anderen Feld durcheinander gekommen... sorry!

Du rufst hier schon Methoden auf (init) und dein Objekt ist noch nicht einmal instanziiert 100%. Das ist unschön!

Oh verdammt...
Wie kann ich onInit denn direkt nach dem initialisieren aufrufen?
Ich möchte nicht, dass man die Methode jedes mal von Hand aufrufen muss...
 
G

Gast2

Gast
Du kannst dir eine Factory Methode schreiben:

Java:
public static NeoScreen createGuiNPC(SpoutPlayer player) {
  NeoScreen instance = new GuiNPC(player);
  instance.init();
  return instance;
}
 

irgendjemand

Top Contributor
ich hab da auch noch was anzumerken

Java:
public class B extends A
{
	public static ArrayList<C> liste = new ArrayList<C>(15);

	public B()
	{
		super();
	}

	public void onInit()
	{
		liste.add(new C());
	}
}

AUA ... das macht man so nicht ...

deklarationen können auch im static-context stehen ...

initialiserungen MÜSSEN in methoden/konstruktoren stehen ...

auch in diesem beispiel KANN "liste" NULL sein ... wenn der compiler das "new List<?>()" erst hinter den call von "onInit()" schiebt ...
was durch den call von "super()" immer der fall sein wird ... da "super()" grundsätzlich IMMER zu erst kommen muss ...

wenn nun durch diesen super-call eine methode gecallt wird die ein objekt verändern soll ... was so noch garnicht exisitiert *da die initialisierung erst NACH super() kommen würde* ist das objekt *oder besser die referenz* NULL

ums mal zu veranschaulichen

deinen pseudo-code würde die VM wie folgt übersetzen :

Java:
public class B extends A
{
	public static ArrayList<C> liste;

	public B()
	{
		super();
		liste = new ArrayList<C>(15)
	}

	public void onInit()
	{
		liste.add(new C());
	}
}

die call-reihenfolge wäre aber : B() -> super() -> A() -> onInit() -> liste.add() -> liste=new List<?>
und aus genau diesem grund bekommst du die NPE
 
B

...ButAlive

Gast
ich hab da auch noch was anzumerken

AUA ... das macht man so nicht ...

deklarationen können auch im static-context stehen ...

initialiserungen MÜSSEN in methoden/konstruktoren stehen ...

auch in diesem beispiel KANN "liste" NULL sein ... wenn der compiler das "new List<?>()" erst hinter den call von "onInit()" schiebt ...

AUA das tut aber mal richtig weh.

Du weißt schon wann statische Felder initialisiert werden? Dann wenn die Klasse geladen wird, und das ist garantiert bevor der Konstruktor aufgerufen wird, denn erst nach dem Laden weiß die VM welche Konstruktoren es gibt.

Natürlich hast du recht dass Initialisierungen in Methoden stehen müssen. Aber der Compiler ist so nett und macht aus:

Java:
class Foo{
  String bar = "Test";
}

Java:
class Foo{
 String bar;  
 void <init>(){
    bar = "Test";
  }
}

Und aus:

Java:
class Foo{
  static String bar = "Test";
}

Java:
class Foo{
 static String bar;  
 static void <clinit>(){
    bar = "Test";
  }
}
 
S

Spacerat

Gast
Da hakt es aber gewaltig...
Was "irgendjemand" da sagt, ist nur teilweise richtig und für ...ButAlive gilt das selbe.
nicht primitive Klassenkonstanten werden unter Umständen erst bei ihrer ersten Verwendung in Konstruktoren instanziert. Wenn man sie nicht explizit in der Klasseninitialisierungs-Methode ([c]static {}[/c]) initialisiert, bekommt man möglicherweise solche Probleme, wie der TO (er ruft eine Klassen-Methode auf).
Im Übrigen lassen sich (vorzugsweise bei Singletons) Konstruktoren auch schon bei der Initialisierung der Klasse aufrufen... das ist böse. XD
 
Zuletzt bearbeitet von einem Moderator:
B

...ButAlive

Gast
nicht primitive Klassenkonstanten werden unter Umständen erst bei ihrer ersten Verwendung in Konstruktoren instanziert.
Wenn man sie nicht explizit in der Klasseninitialisierungs-Methode ([c]static {}[/c]) initialisiert, bekommt man möglicherweise solche Probleme, wie der TO (er ruft eine Klassen-Methode auf).

Da sagt die Spezifikation aber etwas anderes:

A static initializer declared in a class is executed when the class is initialized (§12.4.2). Together with any field initializers for class variables (§8.3.2), static initializers may be used to initialize the class variables of the class.

Chapter*8.*Classes

Wobei dieser Code:

Java:
public class Foo
{
    static String bar = "HALLO";
}

und dieser Code:

Java:
public class Foo
{
    static String bar;
    static{
        bar = "HALLO";
      }
}

den selben ByteCode erzeugen.

Code:
public class Foo extends java.lang.Object{
static java.lang.String bar;

static {};
  Code:
   0:	ldc	#10; //String HALLO
   2:	putstatic	#12; //Field bar:Ljava/lang/String;
   5:	return

public Foo();
  Code:
   0:	aload_0
   1:	invokespecial	#17; //Method java/lang/Object."<init>":()V
   4:	return

}

Das Problem das der TO hat tritt in seinem abstrakten Beispiel gar nicht auf. Im "richtigen" Code den er als 2. gepostet hat, ist die Liste nicht
Code:
static
und dann kommt das beschriebene Problem.
 
B

...ButAlive

Gast
Irgendwie reden wir aneinander vorbei. Wenn man eine statische Variable instanziert ohne einen static initzialzier Block zu schreiben, erzeugt der Compiler einen. Man muss diesen nicht explizit angeben. Dieser wird dann ausgeführt wenn die Klasse instanziert wird. Das ist der Fall, wenn der Classloader sie zum ersten mal lädt.

Bevor man den Konstruktor einer Klasse aufrufen kann, ist garantiert die Klasse schon geladen.
 
S

Spacerat

Gast
Irgendwie reden wir aneinander vorbei.
Mag sein.
Bevor man den Konstruktor einer Klasse aufrufen kann, ist garantiert die Klasse schon geladen.
Geladen ja, aber initialisiert? Nicht unbedingt. Konstrukte wie
Java:
class AnyClass
{
  static AnyClass instance;

  static
  {
    instance = new AnyClass();
  }

  AnyClass()
  {
    // some code
  }
}
funktionieren zwar, aber man muss genau wissen, was man wann tut, sonst kommt der Hangman. Z.B. braucht man sich nicht einfallen lassen, innerhalb des Konstruktors auf "instance" zugreifen zu wollen. Eigentlich sollten solche Konstrukte verboten werden, damit man einen Mechanismus hinbekommt, der sicherstellt, dass eine Klasse vollständig initialisiert wurde, noch bevor der Konstruktor aufgerufen werden kann. Wie will man denn sonst wissen, wann eine Klasse spätestens initialisiert ist bzw. sein sollte? Wie gesagt: Die von der VM automatisch eingefügten initializer werden irgendwo mitten bei der ersten Instanzierung aufgerufen.
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Ich brauche eine Schleife die eine beliebige Zahl so lange durch 10 teilt bis zur Null Java Basics - Anfänger-Themen 5
M NullPointerException: Cannot read the array length because "this.Kinder" is null Java Basics - Anfänger-Themen 1
W Null-Pointer Exception beim Programmstart Java Basics - Anfänger-Themen 8
J 2 listen vergleichen, die auch null Elemente haben können ! Java Basics - Anfänger-Themen 9
W Null-Pointer trotz Konstruktor? Java Basics - Anfänger-Themen 9
S leeres Array statt Null Pointer Exception ausgeben Java Basics - Anfänger-Themen 20
I Grundsatzfrage: Belegt eine Referenz auf 'null' RAM, und wenn ja - wieviel ;-) ? Java Basics - Anfänger-Themen 5
H Ein übergegebenes Objekt auf null setzen Java Basics - Anfänger-Themen 9
P Buffer und null Java Basics - Anfänger-Themen 3
"java.util.HashMap.get(Object)" is null Java Basics - Anfänger-Themen 10
jakobfritzz Array- cannot invoke "" because "" is null Java Basics - Anfänger-Themen 4
W Wie ziehe ich von einer bestimmten Zahl, Zahlen ab, bis mein Ergebnis null beträgt? Java Basics - Anfänger-Themen 10
N null in String replacen Java Basics - Anfänger-Themen 16
S JavaKara Null Exception Error Java Basics - Anfänger-Themen 4
K Bufread.readLine())!= null wie beenden? Java Basics - Anfänger-Themen 4
C Variablen Provided text for message may not be null Java Basics - Anfänger-Themen 9
T ComboBox getValue() zeigt null Java Basics - Anfänger-Themen 7
J null exception Array Java Basics - Anfänger-Themen 5
tobikoch String x= null Bedeutung Java Basics - Anfänger-Themen 9
C NumberFormatException: null ohne Ausnahmebehandlung stoppen Java Basics - Anfänger-Themen 7
J Int wird als Null ausgegeben Java Basics - Anfänger-Themen 8
M Prüfen auf null ohne NPE Java Basics - Anfänger-Themen 1
C Array-Eintrag wieder auf Null setzen Java Basics - Anfänger-Themen 3
C Array auf Null-Inhalte prüfen Java Basics - Anfänger-Themen 9
V NullPointerException, wenn Key und Value null sind Java Basics - Anfänger-Themen 2
M jTable bekommt null Java Basics - Anfänger-Themen 1
B MySQL (jdbc) -> connection liefert NULL Java Basics - Anfänger-Themen 3
der_Schokomuffin Hilfe gesucht: String wird auf null gesetzt! Java Basics - Anfänger-Themen 17
L Warum ist Variable null? Java Basics - Anfänger-Themen 3
J javax.servlet.ServletException: Name is null Java Basics - Anfänger-Themen 7
B if(object== null) abkürzen? Java Basics - Anfänger-Themen 6
O JavaArray Null Java Basics - Anfänger-Themen 3
U Null Exception aber keine Ahnung warum Java Basics - Anfänger-Themen 5
W NullPointerException obwohl nicht null? Java Basics - Anfänger-Themen 3
D Best Practice Konvention - Klassenmembers auf null setzen? Java Basics - Anfänger-Themen 2
I Null-Überprüfung durch Lambda-Expressions abkürzen Java Basics - Anfänger-Themen 8
Orkanson Null Pointer Expception Java Basics - Anfänger-Themen 3
M set Integer bzw. set null mit SQL DB Java Basics - Anfänger-Themen 9
I Polymorphie Null Objekt Java Basics - Anfänger-Themen 3
O Datentypen Integer mit führender Null Java Basics - Anfänger-Themen 13
DaCrazyJavaExpert Compiler-Fehler Variable nicht mit null initialisiert, trotzdem: NullPointerException Java Basics - Anfänger-Themen 28
J Einfache Frage zu "null" Java Basics - Anfänger-Themen 2
T Datei in Array einlesen "null" Java Basics - Anfänger-Themen 8
P Operatoren Parameter nicht auf null geprüft? Java Basics - Anfänger-Themen 16
K Operatoren 2D Int Array auf Null-Referenzen prüfen Java Basics - Anfänger-Themen 18
C Null Pointer Exception Java Basics - Anfänger-Themen 10
V Elemente aus einem Array mit null überschreiben Java Basics - Anfänger-Themen 4
V String Array gegen null-Eintrag sichern Java Basics - Anfänger-Themen 11
G Null Pointer Exception Java Basics - Anfänger-Themen 4
R Gleitkommazahlen ohne führende Null Java Basics - Anfänger-Themen 10
M array = null Java Basics - Anfänger-Themen 2
F String equals NULL Problem Java Basics - Anfänger-Themen 4
F JSON null macht mir ein Problem Java Basics - Anfänger-Themen 3
R Property Value als null setzen Java Basics - Anfänger-Themen 1
D Arrays.toString spuckt null aus? Java Basics - Anfänger-Themen 3
T Compiler-Fehler Null type safety (type annotations) Java Basics - Anfänger-Themen 5
F Erste Schritte Unterschied: Array "leer" / "null" Java Basics - Anfänger-Themen 3
J Fehlerhafte Ausgabe "null" Java Basics - Anfänger-Themen 2
G Threads zum Thema Threads??? null Ahnung Java Basics - Anfänger-Themen 4
W Input/Output DataOutputStream gibt NULL zurück Java Basics - Anfänger-Themen 5
J Einfach verkettet List: Ausgabe ohne null Java Basics - Anfänger-Themen 11
D OOP Warum bekomme ich eine Null-Pointer Exception!!? :( Java Basics - Anfänger-Themen 4
D Null Ausgabe obwohl wert zugewiesen Java Basics - Anfänger-Themen 5
J Alias null Java Basics - Anfänger-Themen 4
B Aliasing bei null-Objekten Java Basics - Anfänger-Themen 3
A null-Überprüfung Java Basics - Anfänger-Themen 24
O Methode gibt Null zurück Java Basics - Anfänger-Themen 7
D Methoden Implementieren von einer Zoomfunktion innerhalb eines JPanels mit null-Layoutmanager Java Basics - Anfänger-Themen 1
A Null Pointer Exception in Liste Java Basics - Anfänger-Themen 11
T Null Java Basics - Anfänger-Themen 3
X Array trotz Befüllung "null" Java Basics - Anfänger-Themen 11
P JavaFX Textfelder geben immer null zurück Java Basics - Anfänger-Themen 8
K Selbst renderndes Object auf null setzen Java Basics - Anfänger-Themen 1
L Null Pointer Exception bei setText Java Basics - Anfänger-Themen 9
D Methode die statt char[] ein "null" zurück gibt Java Basics - Anfänger-Themen 8
J .txt Datei "einlesen "und in String speichern ergibt immer NULL Java Basics - Anfänger-Themen 17
M Input/Output File.listFiles() gibt null zurück Java Basics - Anfänger-Themen 3
M Kann einen Array nicht füllen, im Nachhinein nur "null"-Werte Java Basics - Anfänger-Themen 11
J Verschränkte Rekursion und null Ahnung... Java Basics - Anfänger-Themen 0
X Vererbung Setzen auf Null bei Subklassen Java Basics - Anfänger-Themen 2
S Rückgabewert null in Methode mit Thread Java Basics - Anfänger-Themen 2
C MIME-Type null Java Basics - Anfänger-Themen 4
T Null Pointer Exception Java Basics - Anfänger-Themen 4
M toString gibt "null" statt "0.0" aus Java Basics - Anfänger-Themen 5
M Konstruktor auf null prüfen, Arrays Java Basics - Anfänger-Themen 9
G Null Pointer Exeption Java Basics - Anfänger-Themen 8
A If object != null funktioniert nicht Java Basics - Anfänger-Themen 2
N 'null' aus String löschen Java Basics - Anfänger-Themen 7
F Irgendein "Null" Fehler.... Java Basics - Anfänger-Themen 5
P Map liefert bei put null als Ergebnis Java Basics - Anfänger-Themen 6
M Interface Das Null-Layout Java Basics - Anfänger-Themen 12
M Problem mit null pinterexception beim laden von Bildern Java Basics - Anfänger-Themen 20
Dogge NumberFormatException null Java Basics - Anfänger-Themen 5
C 2 Objekte, 1 immer Null? Java Basics - Anfänger-Themen 8
H Mehrdimensionales Array - Inhalt auf Null überprüfen Java Basics - Anfänger-Themen 5
J db4o-attrbibutauslesen null Java Basics - Anfänger-Themen 9
MiMa Null Inhalte in Variablen Java Basics - Anfänger-Themen 28
B Variable wird einfach so wieder auf "null" gesetzt Java Basics - Anfänger-Themen 12
R Null und 0 Java Basics - Anfänger-Themen 13
H Methoden null-Argument bei varargs Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben