NullPointerException - Problemlösung?

Erbsenkommandant

Grünschnabel
Ich habe durch Google ein wenig auf euren Seiten bzw. Forem herumgestöbert, da hab ich 3 Themen gefunden die auf das selbe Problem verweisen.
Nun programmier ich aber erst seit 3 Wochen, und kann mich jetzt nicht so wunderprächtig in dem Quellcode-Wirr-Warr zurechtfinden und auch keine Lösung für mein Problem finden, ich habe zwar eine Ahnung woran es liegt, aber mir fehlen die Mittel um es zu beseitigen.

Grundsätzlich zu meinem Problem:
Ich habe 3 Klassen
2 Konstruktoren
und ein paar Methoden in 2 Klassen mit den Methoden.
Im Anhang hab ich mal mein Programm als txt angehängt.

meine java -version ist 1.6.0_16
compiler version ist auch 1.6.0_16
ich verwende Notepad++ und Windows-cmd zum ausführen.

in meiner ersten Klasse (Punkt2D) ist folgender Konstruktor (Punkt2D):

//Darstellung eines Punktes mit x/y koordinaten
public double []PunktArray;

public Punkt2D (double f, double g)
{
double []PunktArray = {f,g};
}

ich bin mir nich so ganz sicher ob ein Konstruktor so geschrieben wird, jedenfalls gibt es beim compelieren keinen fehler.

dann den 2 Konstruktor (Kreis) in der Klasse (Kreis):

//Darstellung eines Kreises mit dem Typ Punkt2D und einer double d (für Radius)
public double []ArrayK;

public Kreis (Punkt2D c, double d){
double []ArrayK = {c.PunktArray[0], c.PunktArray[1],d};
}


beim ausführen mit meinem Testprogramm gibt es eine Fehlermeldung

Exception in thread "main" java.lang.NullPointerException
at Kreis.<init> (Kreis.java:14)
at TesterArray.main(TesterArray.java:28)

ich hab auch bei Google gelesen, dass nach dem Stack Trace der Fehler beim erstellen des Konstruktors in Kreis.java das Problem ist.

Ich erstelle eine Variable vom Typ Punkt2D die als Array wiedergegeben wird.
anschließend verwende ich dieses Array und dem Variablen-Namen in meinem Konstruktor Kreis. der mir das Array aufbröselt, und mir ein längeres Array ausgibt.
und hier gibts das Problem, dass anscheinend mein Array entweder NULL, also komplett leer ist. (nach meinem Verständnis)
oder der Konstruktor in dem anderen Konstruktor nicht angewendet werden kann, und deshalb nichts erstellt wird, und ein NULL-irgendwas versucht wird aufzurufen...

...naja, selbst wenn ich mit der vermutung richtig liege, habe ich keinen schimmer wie ich das Problem dann lösen sollte.


Ich habe, wie schon erwähnt mein Programm (es ist compelierbar und besteht aus 3 txt) angehängt, für eine Lösung des Problems wäre ich sehr dankbar, noch mehr dankbar für eine Erklärung und eine Lösung =)
 

Anhänge

  • TesterArray.txt
    2 KB · Aufrufe: 28
  • Punkt2D.txt
    642 Bytes · Aufrufe: 31
  • Kreis.txt
    1.006 Bytes · Aufrufe: 24
Zuletzt bearbeitet:
Hallo,

aber mir fehlen die Mittel um es zu beseitigen.

Was meinst du damit?


Die NullPointerException fliegt weil dein Array in der Klasse Punkt2D null ist. Du legst es zwar einmal als Instanz-Variable an, aber initialisierst es nie. Stattdessen deklarierst du im Konstruktor ein neues Array und initialisierst dieses.

Gruß

Sascha
 
Wie sieht dieses initialisieren denn aus?

Mir fehlen die Mittel bedeutet nur, dass ich nicht so viele befehle bis jetzt kenne und auch nicht mit jedem Fremdwort etwas anfangen kann.
Ich hab schlicht und ergreifend, kaum eine Ahnung von Tricks, spezial-schreibweisen oder sonstiges.
 
Das Problem liegt hier:

Java:
//Darstellung eines Kreises mit dem Typ Punkt2D und einer double d (für Radius)
public double []ArrayK;

public Kreis (Punkt2D c, double d){
double []ArrayK = {c.PunktArray[0], c.PunktArray[1],d};
}

Du hast ein Array "ArrayK", welches für die gesamte Instanz des Punkt2D "bekannt" ist.

Jetzt versuchst du im Konstruktor, diesem Array Werte zu geben. ABER: Du erzeugst stattdessen ein neues Array, das genau heißt, aber nur innerhalb des Konstruktors bekannt ist. Danach ist der Konstruktor beendet, und der Rest der Klasse sieht immer noch nur das Array, das immer noch null ist.

Du willst im Konstruktor die Instanzvariable ArrayK initialisieren:

Java:
public Kreis (Punkt2D c, double d){
this.ArrayK = {c.PunktArray[0], c.PunktArray[1],d};
}

theoretisch könntest du das "this." auch weg lassen, aber es zeigt sehr schön, dass du auf eine Variable zugreifst, die der gesamten Instanz, also dem Punkt2D Objekt, bekannt ist, und nicht auf eine lokale Variable, die nur in der Methode, hier also dem Konstruktor, und eben nicht überall definiert ist.

Gruß,

RoCMe
 
Deklarieren heißt, dass du eine Variable anlegst.

Bsp
Code:
int i;

Initialisieren heißt, dass einer deklarierten Variable zum ersten mal ein Wert zugewiesen wird.

Code:
i = 3;
//Deklaration und Initialisierung auf einmal
int j = 4;

Das sind Wörter die du auf jedenfall können solltest, wenn du programmieren möchtest.
Bei deinem Problem handelt es sich auch nicht um einen Trick, eine spezialschreibweise oder was anderes, sondern um eine normale Initialisierung eines Arrays.

Ich schätze, dass du gerade erst mit Programmierung angefangen hast. Damit das Ganze hier auch einen Lerneffekt hat, solltest du dir das mal anschauen. ;-)
http://openbook.galileocomputing.de...03_010.htm#ix297b6cff0ef78f66988fb1230bd01a2d

Gruß

Sascha
 
dh. also, das "this" verweist mein ArrayK nach oben, bzw innerhalb des programms, um es dort dann zu füllen.

mein Problem war also, dass mein
double [ ] ArrayK = (....)
jedes mal nur Konstruktor-intern bearbeitet wurde?
und danach wieder den wert "nichts" angenommen hat...?

und das selbe gilt dann wahrscheinlich auch für mein Punkt2D Konstruktor?

Deklarieren heißt, dass du eine Variable anlegst.

Bsp
Code:
int i;

Initialisieren heißt, dass einer deklarierten Variable zum ersten mal ein Wert zugewiesen wird.

Code:
i = 3;
//Deklaration und Initialisierung auf einmal
int j = 4;

Das sind Wörter die du auf jedenfall können solltest, wenn du programmieren möchtest.
Bei deinem Problem handelt es sich auch nicht um einen Trick, eine spezialschreibweise oder was anderes, sondern um eine normale Initialisierung eines Arrays.

Ich schätze, dass du gerade erst mit Programmierung angefangen hast. Damit das Ganze hier auch einen Lerneffekt hat, solltest du dir das mal anschauen. ;-)
http://openbook.galileocomputing.de...03_010.htm#ix297b6cff0ef78f66988fb1230bd01a2d

Gruß

Sascha

aber im grunde hab ich doch mein ArrayK, bzw mein PunktArray initialisiert...
mit :
double []PunktArray;
und
double []ArrayK;

und in dem jeweils untenstehenden Konstruktor dann befüllt.
demnach hab ich es doch initialisiert?



java ist auch eine insel such ich auch gerade ab, aber ich sitz an dem problem schon seit Freitag 10uhr und hab bis jetzt schon über 12stunden insgesamt mit fehlerbehebung verbracht. und durch java ist auch eine insel kämm ich mich auch schon durch, aber ich versteh nciht was ich jetzt noch falsch gemacht hab.
 
Sobald double, int, byte, boolean usw vor einer Variable steht, wird dort eine neue Variable angelegt.
Da ändert dann auch nichts der Name dran.
Um mal ein einfaches Beispiel zu nehmen, nur weil dein Nachbar genauso heißt wie du, ist er nicht du. ;-)

Mit this kannst du auf alle Instanzvariablen zugreifen. Du musst this aber nur verwenden, wenn du in der Methode eine lokale Variable mit gleichem Namen hast.

Code:
public class Test{

   // Instanz-Variable i wird angelegt
   private int i;

   public Test(){
      //Neue lokale Variable wird angelegt.
      int i = 4;
      //so sollte es aussehen
      //i = 4;
   }

}

Gruß

Sascha
 
public class Punkt2D{

public double []PunktArray;

public Punkt2D(double f, double g){
this.PunktArray[] = {f,g};
}}


demnach kann ich dann aber trotzdem neue Konstruktoren mit unterschiedlichen eigenschaften erzeugen.
sonst würde es für mich ja keinen sinn ergeben.

Punkt2D
mit eigenschaft
PunktArray = 1 , 2

Kreis
mit eigenschaft
ArrayK = Punkt2D(Array(stelle1)), Punkt2D(Array(stelle2)), 3

so wars gedacht, aber warum ruft er mir die Eigenschaft nicht auf wenn ich Punkt2D aufrufe?

und wenn ich den array ausserhalb des konstruktors deklariere dann ist er doch nur innerhalb des Programms des Konstruktors einsehbar, und vorallem dann keine eigenschaft des Konstruktors, sondern ein allgemeiner wert, der nach jedem Konstruktor-einsatz verändert wird, aber vorherige werte nicht mehr aufgerufen werden können.

dann müsste es dann doch ganz ohne deklaration von oben aussehn.
also kann ich auch das this weglassen.

public class Punkt2D{

public Punkt2D(double f, double g){
double []PunktArray = {f,g};
}}
 
Wenn ich mir deinen Text hier durchlese, weiß ich mittlerweile gar nicht mehr was du machen möchtest.

Erstmal, wenn du von einer anderen Klassen auf eine Variable einer anderen Klasse zugreifen möchtest, musst du sie als Instanz-Variable deklarieren.
Wenn du diese Variable dann im Konstruktor initialisierst, hat sie einen Wert bis sie verändert wird. Legst du ein neues Object von dieser Klasse an, ist es wie gesagt ein neues Object und der Wert in der anderen Klasse hat sich nicht verändert.

Wenn du sie nur im Konstruktor anlegt, dann ist die Variable weg, sobald der Konstrukor abgearbeitet wird.

Gruß

Sascha
 

Neue Beiträge

Zurück