Programmcodefehler mit Exception in thread "main" java.lang.NullPointerException

IcocaI

Mitglied
Hallo liebe leut,

hab ein Problem mit meinem code :( ... und bin fast am verzweifeln wie fast jeder programmierer XD ... naja zur sache ... erstmal den code:

Java:
package Main;
import Automat.Geldautomat;
import Automat.Konto;
import Automat.Kontoverwalter;
import lese.Lese;

public class Main {
	
	/*private double betrag;
	
	public void setBetrag(double b){
		this.betrag = b;
	}
	
	public double getBetrag(){
		return this.betrag;
	}*/
	
	public void setText(){
		Geldautomat geldautomat = new Geldautomat();
		Kontoverwalter kontoverwalterAufgabe = new Kontoverwalter();
		
		int wahl;
		int ktoNr;
		double betrag;
		
		do				// Fußgesteuerte Schleife
		{
			System.out.println("Willkommen...\n");					// Text ausgabe
			System.out.println("1. abheben\n2. einzahlen\n");
			System.out.print("->");				
			wahl = Lese.readInt();				// eingabe vom Benutzer wird erwartet
			
			if(wahl == 1){								// if-Abfrage
				System.out.print("Geben Sie das Konto ein :");
				ktoNr = Lese.readInt();
				System.out.print("Geben Sie den Betrag ein :");
				betrag = Lese.readDouble();
							
				if(betrag >= geldautomat.getVorrat())			// überprüfe ob der vorrat reicht
					System.out.println("Das Geld kann nicht ausgezahlt werden.\nFragen Sie Ihren Hausarzt");
				else
					kontoverwalterAufgabe.abheben(ktoNr, betrag);
			}
			else if(wahl == 2){
				System.out.print("Geben Sie das Konto ein");
				ktoNr = Lese.readInt();
				System.out.print("Geben Sie den Betrag ein");
				betrag = Lese.readDouble();
				
				kontoverwalterAufgabe.einzahlen(ktoNr, betrag);
			}
			else
				System.out.println("Falsche eingabe");
		}while(wahl != 0);		// die Schleife läuft so lange bis "0" eingegeben wird
	}
	
	public static void main(String[] args) {		
		Main mains = new Main();
		Geldautomat geldautomat = new Geldautomat();				
		Konto[] konto = new Konto[4];
		 
		Konto k1 = new Konto(1, 1000);
		Konto k4 = new Konto(4, 500);
		Konto k2 = new Konto(2, 200, 100);
		Konto k3 = new Konto(3, 350, 500);
			
		konto[0] = k1;
		konto[1] = k2;
		konto[2] = k3;
		konto[3] = k4;
		
		//Kontoverwalter kontoDummy = new Kontoverwalter(konto);
				
		geldautomat.setText();
		mains.setText();
		
	}
}

Java:
package Automat;

public class Kontoverwalter implements Kontointerface{

	Geldautomat statusGeldautomat = new Geldautomat();
	
	private Konto[] konto;
	
	public Konto[] getKonto(){
		return this.konto;
	}
	
	public Kontoverwalter(){
	}
	
	public Kontoverwalter(Konto[] k){
		this.konto = k;
	}
	
	public void abheben(int i, double b) {
		int ktoNr = i;
		double betrag = b;
		double erg = 0;
		
		for(int x = 0; x <= 3; x++){
			if(this.konto[x].getKtoNr() == ktoNr){
				erg = this.konto[x].getKtoStand() - betrag;                 // <<<<< so wie ich das verstanden habe ist da der fehler versteckt (Exception)
				this.konto[x].setKtoStand(erg);
			}
			else
				System.out.println("Error !\n\n");
		}
	}

	public void einzahlen(int i, double b) {
		int ktoNr = i;
		double betrag = b;
		double erg = 0;
		
		for(int x = 0; x <= 3; x++){
			if(this.konto[x].getKtoNr() == ktoNr){
				erg = this.konto[x].getKtoStand() + betrag;
				this.konto[x].setKtoStand(erg);
			}
			else
				System.out.println("Error !\n\n");
		}
	}

}

Java:
package Automat;


public class Geldautomat {

	private double vorrat = 500;			// double variable
	
	public double getVorrat(){
		return this.vorrat;
	}
	
	public void setText(){
		System.out.println("Geldautomat Sparkasse\n");
	}
}

Java:
package Automat;


public class Konto {

	private int ktoNr;
	private double ktoStand;
	private double dispo;
		
	public Konto(int kn, double ks){
		this.ktoNr = kn;
		this.ktoStand = ks;
	}
	
	public Konto(int kn, double ks, double d){
		this.ktoNr = kn;
		this.ktoStand = ks;
		this.dispo = d;
	}
	
	public double getKtoStand() {
		return ktoStand;
	}
	
	public void setKtoStand(double k){
		this.ktoStand = k;
	}
	
	public double getDispo() {
		return dispo;
	}
	
	public int getKtoNr() {
		return ktoNr;
	}
}


Java:
package Automat;


public interface Kontointerface {
	
	public void abheben(int i, double b);
	public void einzahlen(int i, double b);
}

dann gibs da noch die Lese Klasse was hauptsächlich für die eingabe da ist ...

ist etwas lang ^^ ...
im internet hab ich was zu dem fehler gefunden nur das problem ist es hat mir nicht wirklich geholfen das problem zu lösen.

Hier ein auszug:

#

Exception in thread "main" java.lang.NullPointerException
at Test.main(Test.java:5)

Der Versuch auf eine Objektrefernz zu zugreifen, die den Wert null enthält. Die Referenz muss entweder mit einer anderen Referenz oder mit dem new-Operator initialisiert werden. Der Fehler kann auch im Zusammenhang mit Hüllklassen auftreten, dazu ein Beispiel:

public class Test {
public static void main(String[] args) {
Integer[] array = new Integer[5];
int i = array[0]; // <-- hier tritt die Exception auf
System.out.println(i);
}
}

Arrays werden in Java standardmäßig mit 0 bzw. null initialisiert. Daher kommt beim Compilieren keine Meldung vom Typ "variable *** might not have been initialized". Wird dann versucht mit dem Integer-Objekt zu arbeiten tritt die Exception auf.

es steht da zwar das man eine andere referenz oder mit einem new-operator initialisiert werden muss. aber wie !! bin frustriert ...
 
Zuletzt bearbeitet:
Mir ist was anderes aufgefallen:

Du intialisiert in der f. main() einen Geldautomaten, rufst die Output-Funktion auf, und dann die der Main().
In der Main erzeugst du wieder einen Geldautomaten, der alte wird ausrangiert, da ja keine Referenz mehr hin zeigt. Man kann aber Objekte per Parameter übertragen:

//
public void setText(Geldautomat geldautomat){
//Die Intialisierung darunter entfernen

mains.setText(geldautomat);

Damit bekommt die void quasi dem alten Automaten, und du kannst ihm weiterverwenden.
Habe ich nur geschrieben, da ich denke dass du es nicht wusstest, wie du es gemacht hast.

Ach ja, das heißt einfach nur, dass eine Variable nichts enthält:

Main m; //Leer.
m.setSize(100, 100); //Fehler, m ist ja leer.

Main m = new Main() //EIne neue Main wird in die Variables m geschrieben.
m.setSize(100, 100); //Funktioniert, da m NICHT leer ist.


Edit: Ich habs.
Du deklarierst am Anfang im Kontenverwalter das Array, füllst es aber nicht.
 
Zuletzt bearbeitet:
Hi.
Edit: Ich habs.
Du deklarierst am Anfang im Kontenverwalter das Array, füllst es aber nicht.
Soweit ich gesehen hab wird der Kontenverwalter nicht verwendet (ist auskommentiert) und das Array wird über den Konstruktor gesetzt.
\edit: Nein, du hast Recht. In der setText Methode wird ein Kontenverwalter über den Standardkonstrutor instanziiert.

@IcocaI: Poste einfach mal den Text der Exception und mach am besten mal aus den [code] [/code] Boxen [code=java] [/code] Tags - sieht nicht nur schöner aus, man kann auch die Zeilennummern ablesen.

Gruß
 
Mir ist was anderes aufgefallen:

Du intialisiert in der f. main() einen Geldautomaten, rufst die Output-Funktion auf, und dann die der Main().
In der Main erzeugst du wieder einen Geldautomaten, der alte wird ausrangiert, da ja keine Referenz mehr hin zeigt. Man kann aber Objekte per Parameter übertragen:

//
public void setText(Geldautomat geldautomat){
//Die Intialisierung darunter entfernen

mains.setText(geldautomat);

Damit bekommt die void quasi dem alten Automaten, und du kannst ihm weiterverwenden.
Habe ich nur geschrieben, da ich denke dass du es nicht wusstest, wie du es gemacht hast.

@ kai008: Also das gucke ich mir morgen nochmal genauer an ... aber danke für den hinweis wusste ich wirklich nicht ^^

@deepthroat: das mit dem [code=java] mach ich sofort immer sieht wirklich besser aus ^^ .... also ich wollte halt Objektorientiert arbeiten ... das der Zeile 21. von der Klasse Main
Java:
  Kontoverwalter kontoverwalterAufgabe = new Kontoverwalter();
hab ich gemacht weil ich von der zeile 61 - 71
Java:
Konto[] konto = new Konto[4];
         
        Konto k1 = new Konto(1, 1000);
        Konto k4 = new Konto(4, 500);
        Konto k2 = new Konto(2, 200, 100);
        Konto k3 = new Konto(3, 350, 500);
           
        konto[0] = k1;
        konto[1] = k2;
        konto[2] = k3;
        konto[3] = k4;
einfügen wollte aber nicht ging da der mir ein fehler mitm " ; " angezeigt hat ... ich dacht halt das ich so über die erstellten konstruktoren, die in dem array gespeichert wurden, darauf zugreife ... ich hab das in zeile 21 gemacht weil ich sonst keine möglichkeit gefunden habe über das Objekt die anderen methoden zuzugreifen weil der dann immer nur das mitm array wollte und ich nichts anderes auswählen konnte (Eclipse halt) ^^... also ich weiß jetzt das ich die daten irgendwie übergeben muss ... da habt ihr beide recht ^^ mit dem fehler :p


das in zeile 73 von main hab ich nur zum testen benutzt ... um zu gucken ob ich darüber mit der instanz die z.b. kontonummer holen kann was ja auch ging ^^ .... also
Java:
 kontoDummy.getKonto()[0].getKtoNr();


den genauen zeilenfehler kann ich erst morgen schicken ... aber einer ist in zeile 27 beim kontoverwalter ... weil das array ja leer ist und somit nicht z.b. auf die kontonummer von dem konto zugreifen kann ^^ ich komme glaub ich so langsam dahinter
 
Java:
Exception in thread "main" java.lang.NullPointerException
	at Automat.Kontoverwalter.abheben(Kontoverwalter.java:27)
	at Main.Main.setText(Main.java:44)
	at Main.Main.main(Main.java:77)

Also das ist der Fehler der ausgegeben wird ...
 
Du verwendest hier
Java:
Kontoverwalter kontoverwalterAufgabe = new Kontoverwalter();
den Konstruktor ohne Parameter - somit wird die Instanzvariable konto nie initialisiert, was in der Nullpointer-Exception resultiert.
Versuchs mal mit Deinem zweiten Konstruktor:
Java:
Kontoverwalter kontoverwalterAufgabe = new Kontoverwalter(konto);
 
den genauen zeilenfehler kann ich erst morgen schicken ... aber einer ist in zeile 27 beim kontoverwalter ... weil das array ja leer ist
Nein, das Array ist nicht leer (das würde ja nur heißen, das 0 Elemente in dem Array drin sind). Das Array existiert gar nicht, d.h. es ist null.

Du mußt dich selber zwingen die Kontenverwalter Klasse nur mit einem gültigen Konto-Array instanzieren zu können. D.h. du löschst als allererstes mal den Standardkonstruktor:
Java:
public Kontoverwalter(){
    }
So kannst du gar nicht in die Verlegenheit kommen ein "unvollständiges" Objekt zu erstellen, denn jetzt mußt du unbedingt den anderen Konstruktor verwenden, so wie in main():73.

Dann müßtest du entweder den Kontoverwalter an die setText Methode übergeben (da solltest du dringend mal über den Namen nachdenken, irgendeinen Text setzt die Methode ja gar nicht...) oder du verlagerst den ganzen Code aus der setText Methode in die main Funktion (dann brauchst du auch kein Main Objekt).

Gruß
 
Hi, deepthroat hat Recht würde ich sagen.

Du kannst z.B. ein Interface anlegen, in dem Du eine Template Methode
definierst, die die Konstruktion vorschreibt.

Konstruktoren reichen auch, aber in spezielleren Fällen ist eine template Methode
eleganter und praktisch.

Gruß, Tim
 

Neue Beiträge

Zurück