PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Java] NullPointerException - Warum?


Gast
2005-09-25, 20:28:15
Nabend,

Folgender Code (Ausschnitt) schmeist mir eine NullPointerException raus:


public void ktowahl()
{
Konto kt = Konten[0];

System.out.println(Konten[0] );


System.out.println("Geben Sie eine Kontonummer fuer ihr erstes Konto ein." );
Konten[0].setKtoNr(StdIn.stringInput()); //Diese Zeile schmeißt die Exception
}


Im Prinzip wird das Objekt kt erzeugt und Konten[0] (Ist vom Typ Konto) zugewiesen. Danach soll mithilfe der Methode setKtoNr dem Objekt eine beliebige Nummer zugewiesen werden. Die setKtoNr()-methode liegt in der Klasse Konto (Ausschnitt):


public void setKtoNr(String ktoNr)
{
this.ktoNr = ktoNr;
}


Frage nun: Warum krieg ich diese Exception bei dem Code? Was muss ich ergänzen, damit ich dem Objekt eine Konto-Nummer zuweisen kann. Wenn ihr zum Verständnis die kompletten Klassen braucht, schreibts einfach.


mfg

Senior Sanchez
2005-09-25, 20:44:18
Nabend,

Folgender Code (Ausschnitt) schmeist mir eine NullPointerException raus:


public void ktowahl()
{
Konto kt = Konten[0];

System.out.println(Konten[0] );


System.out.println("Geben Sie eine Kontonummer fuer ihr erstes Konto ein." );
Konten[0].setKtoNr(StdIn.stringInput()); //Diese Zeile schmeißt die Exception
}


Im Prinzip wird das Objekt kt erzeugt und Konten[0] (Ist vom Typ Konto) zugewiesen. Danach soll mithilfe der Methode setKtoNr dem Objekt eine beliebige Nummer zugewiesen werden. Die setKtoNr()-methode liegt in der Klasse Konto (Ausschnitt):


public void setKtoNr(String ktoNr)
{
this.ktoNr = ktoNr;
}


Frage nun: Warum krieg ich diese Exception bei dem Code? Was muss ich ergänzen, damit ich dem Objekt eine Konto-Nummer zuweisen kann. Wenn ihr zum Verständnis die kompletten Klassen braucht, schreibts einfach.


mfg


Gib mal die ganze Klasse. Du kannst auch mal um dieses setKtoNr() nen try catch machen, die Nullpointerexception fangen und nen Stacktrace ausgeben lassen.

Ich vermute aber mal fast, dass dein Konten[0] ne Nullpointerexception wirft. Da fehlt bestimmt irgendwo die Initialisierung des Elements (die Array-Definition reicht da nicht). Außerdem sollteste dir angewöhnen, entweder alle Bezeichner groß zu beginnen oder klein, keinen mischmasch.

Gast
2005-09-26, 20:07:57
public class Kunde {
// Variablen
private String nName;
private String vName;
private Konto Konten[] = new Konto[4];
private int counter=0;
private int x;
private int aktkto=1;

// GET und SET Methoden
public String getNName() {
return nName;
}
public void setNName(String nName) {
this.nName = nName;
}
public String getVName() {
return vName;
}
public void setVName(String vName) {
this.vName = vName;
}
public Konto getKonten() {
return Konten[x];
}
public void setKonten(Konto Konten) {
this.Konten[x] = Konten;
}



// Konto auswahl
public void ktowahl(){
Konto kt = Konten[0];

System.out.println(Konten[0] );


System.out.println("Geben Sie eine Kontonummer fuer ihr erstes Konto ein." );
Konten[0].setKtoNr(StdIn.stringInput());
do{
if(aktkto<1||aktkto>counter){
System.out.println("Fehler, bitte Eingabe wiederhohlen.");
}
System.out.println("Ihre Konten:");
System.out.println("Konto \t Kontonummer");
for(int y=0; y<counter; y++){
System.out.println(""+(y+1)+".\t"+Konten[y].getKtoNr()+"\t"+Konten[y].getKtoStand());
}
System.out.println("Geben Sie das Konto ein, mit dem Sie Arbeiten wollen.");
aktkto = StdIn.intInput();
}while (aktkto<1||aktkto>counter);
}


public static void main (String args[]){
Kunde kd=new Kunde();
kd.ktowahl();
}
}


Muss keinen Sinn ergeben, die nicht-funktionierenden/unrelevanten Methoden hab ich mal weggelassen.


Außerdem sollteste dir angewöhnen, entweder alle Bezeichner groß zu beginnen oder klein, keinen mischmasch.


Also z.B. "public void setktonr"?

Senior Sanchez
2005-09-26, 20:28:06
Ok, dein Fehler ist genau das was ich schon sagte.
Es reicht nicht, dem Array einen Typ vorzugeben. Damit du auf ein Array richtig zugreifen kannst müssen auch Elemente diesen Typs eingefügt werden und das machst du nicht. Du gehst davon aus, weil dein Array von der Klasse Konto erzeugt wurde, dass bereits Elemente diesen Typs enthält, was aber nicht so ist.
Demzufolge wird bei der Zuweisung von Konten[0] (dieses Element ist halt noch gar nicht initialisiert) an eine andere Variable eben eine Null-Referenz übergeben und wird auf so einer versucht ne Methode aufzurufen, gibts ne NullPointerException.

Wegen Groß und Kleinschreibung.

Variablen werden eigentlich immer mit kleinem Anfangsbuchstaben geschrieben, Klassennamen beginnen dagegen mitm großen Anfangsbuchstaben. Die Ausnahme sind Konstanten die komplett groß geschrieben werden.

Demzufolge müsste dein Konten eigentlich konten geschrieben werden.

Gast
2005-09-27, 11:48:55
Ok, dein Fehler ist genau das was ich schon sagte.
Es reicht nicht, dem Array einen Typ vorzugeben. Damit du auf ein Array richtig zugreifen kannst müssen auch Elemente diesen Typs eingefügt werden und das machst du nicht. Du gehst davon aus, weil dein Array von der Klasse Konto erzeugt wurde, dass bereits Elemente diesen Typs enthält, was aber nicht so ist.
Demzufolge wird bei der Zuweisung von Konten[0] (dieses Element ist halt noch gar nicht initialisiert) an eine andere Variable eben eine Null-Referenz übergeben und wird auf so einer versucht ne Methode aufzurufen, gibts ne NullPointerException.


Aha, und wie füge ich dann Elemente des Typs "Konto" in das Array ein?


Wegen Groß und Kleinschreibung.

Variablen werden eigentlich immer mit kleinem Anfangsbuchstaben geschrieben, Klassennamen beginnen dagegen mitm großen Anfangsbuchstaben. Die Ausnahme sind Konstanten die komplett groß geschrieben werden.

Demzufolge müsste dein Konten eigentlich konten geschrieben werden.

Ich werds mir merken ;)

Senior Sanchez
2005-09-27, 12:10:52
Aha, und wie füge ich dann Elemente des Typs "Konto" in das Array ein?

An geeigneter Stelle machste dann eben sone Aufrufe, um die Elemente zu initialisieren:

konten[0] = new Konto();

Damit wird das erste Element im Array Konten initialisiert. Ich hoffe das reicht als Erläuterung.

Gast
2005-10-26, 15:07:28
Sorry dass ich mich nicht gemeldet hab. Soweit funktioniert auch alles, ich steh jetzt aber vorm nächsten Problem. Ich habe eine Methode erstellt, die ein Array auf Elemente ohne Inhalt durchsuchen soll. In das erste freie Element soll dann ein Objekt erstellt werden. Wenn also z.B. die Elemente 0,1 und 2 mit einem Objekt belegt sind, soll in Element 3 das neue Objekt erstellt werden.

public void neu(){
int x=0;
while(meineKonten[x]==null && x==4){
x++;
}
if (meineKonten[x]==null){
meineKonten[x]=new Konto();

System.out.println("Konto in Element "+x+" erstellt."); //Nur zur Kontrolle

}
else{
System.out.println("Sie koennen keine neuen Konten erstellen!" );
}

}


Allerdings wird in keinem Fall ein Konto erstellt, sondern gleich "Sie koennen keine neuen Konten erstellen!" ausgegeben. Das Element meineKonten[0] wird gleich beim Start des Programmes mit einem Objekt befüllt. Theoretisch müsste bei der Kontrolle "1" ausgegeben werden.

Monger
2005-10-26, 15:18:59
Allerdings wird in keinem Fall ein Konto erstellt, sondern gleich "Sie koennen keine neuen Konten erstellen!" ausgegeben. Das Element meineKonten[0] wird gleich beim Start des Programmes mit einem Objekt befüllt. Theoretisch müsste bei der Kontrolle "1" ausgegeben werden.

Klammerfehler. Deine While Schleife endet vor dem If, statt if und else zu umschließen. In so einem Fall bietet sich sowieso eine ganz normale For Schleife an, also:


for(int i = 0; i < 4; i++){

}

Außerdem ist deine zweite Bedingung in der While Schleife widersinnig. Deine schleife geht solange, wie du leere Elemente hast. Du suchst ja aber nach genau dem ersten leeren Element, d.h. alle davor sind ja vorhanden. Besser du springst einfach aus der Schleife raus, sobald dein Fall erfüllt ist:


if(meineKonten==null){
// hier Aktionen durchführen
break;

DocEW
2005-10-26, 18:59:26
Ich würde eher sagen, daß hier

while(meineKonten[x]==null && x==4){

der Fehler liegt. Richtig wäre "meineKonten[x]!=null && x < 4".

Monger
2005-10-27, 10:18:58
Argh, ich meinte natürlich die erste Bedingung. Die Abfrage auf null direkt im Schleifenkopf ist a) falsch und b) hässlich.