# Problem mit NullPointerException



## obelixpp (17. Dez 2011)

Guten Tag,

ich habe heute ein kleines Spielchen geschrieben habe allerdings beim letzten Schritt ein Problem.
Und zwar wenn ich sage nein ich möchte keine neue Runde spielen bekomme ich die Fehlermeldung NullPointerException.
Ich habe es auch schon mit try und catch blöcken versucht aber leider ohne Erfolg.

Vielleicht hat ja jemand kurz Zeit mal drüber zu gucken.


```
package Aufgabe3;

import java.util.*;

public class Maexchen 
{
	Hashtable punkteHash;
	int wuerfel1;
	int wuerfel2;
	int pasch;
	int punkte;
	double sumPunkte;
	double aktPunkte;
	int runde = 1;

	public static void main(String[] args)
	{
		
		Maexchen spiel = new Maexchen();
		Maexchen punkte = new Maexchen();
		Maexchen ausgabe = new Maexchen();
		Scanner eingabeScanner = new Scanner(System.in);
		
		String Benutzereingabe;
		String eingabe1 = "J";
		String J = "J";
		String j = "j";
		String N = "N";
		String n = "n";
		
		while(eingabe1 == J || eingabe1 ==j)
		{
			spiel.wuerfeln();
			spiel.punkteEingeben();
		
			System.out.print("Möchten Sie noch eine Runde spielen? (J/N) \t");
			Benutzereingabe = eingabeScanner.next();
			System.out.println();
			
			if(Benutzereingabe.equals(N) || Benutzereingabe.equals(n))
			{
				eingabe1 = N;
			}
			else
				eingabe1 = J;
		}
		
		ausgabe.punkteAusgeben();
	}

		// Die erreichten Punkte werden in eine Hashtable eingegeben.
	public void punkteEingeben()
	{
		punkteHash = new Hashtable();
		punkteHash.put(runde,new Double (punkte));
		runde++;
	}
	
		// Punkte werden ausgegeben
	public void punkteAusgeben()
	{
		try
		{
			for (int i=1; i < punkteHash.size();i++) 
			{	
				aktPunkte = Double.parseDouble((String) punkteHash.get(i));
				sumPunkte = sumPunkte + aktPunkte;
			}
			System.out.println("Sie haben insgesamt "+sumPunkte+" in "+punkteHash.keys()+" Runden erspielt.");
		}
		catch(NullPointerException ex)
		{
			System.err.println(ex);
		}
	}
	
		// Es wird für zwei "Würfel" je eine Zufallszahl, mit einem Wert zwischen 1-6 erzeugt.
	public int wuerfeln()
	{
		punkte = 0;
		wuerfel1 = (int) (Math.random()*6)+1;
		wuerfel2 = (int) (Math.random()*6)+1;
		
		System.out.println("Würfel worden geworfen!");
		System.out.println("Gewürfelt wurde eine "+wuerfel1+" und eine "+wuerfel2+".");
		
		// Überprüfung ob ein Mäxchen gewürfelt wurde
		if ((wuerfel1 == 1 && wuerfel2 == 2)||(wuerfel1 == 2 && wuerfel2 == 1))
		{
			punkte = 1000; 
			System.out.println("Herzlichen Glückwunsch, Sie haben ein Mäxchen geworfen!");
		}
		
		// Überprüfung ob ein Pasch gewürfelt wurde
		pasch = 0;

		if (wuerfel1 == wuerfel2) 
		{
			punkte = (wuerfel1*100);
			System.out.println("Super, Sie haben ein Pasch mit zwei "+wuerfel1+"-en geworfen.");
			System.out.println("Das sind "+punkte+" Punkte.");
		}
	
		// Alternativ Punkte errechnen
		if (punkte == 0)
		{
			punkte = (Math.max(wuerfel1, wuerfel2)*10)+Math.min(wuerfel1, wuerfel2);
			System.out.println("Gut, Sie haben "+punkte+" Punkte erreicht.");
		}		
		
		return punkte;
	}

}
```


----------



## Gast2 (17. Dez 2011)

Wo tritt die Exception auf? In der Zeile ist dann irgendeine Referenz null.


----------



## obelixpp (17. Dez 2011)

EikeB hat gesagt.:


> Wo tritt die Exception auf? In der Zeile ist dann irgendeine Referenz null.



Würfel worden geworfen!
Gewürfelt wurde eine 2 und eine 6.
Gut, Sie haben 62 Punkte erreicht.
Möchten Sie noch eine Runde spielen? (J/N) 	n


```
Exception in thread "main" java.lang.NullPointerException
	at Aufgabe3.Maexchen.punkteAusgeben(Maexchen.java:62)
	at Aufgabe3.Maexchen.main(Maexchen.java:48)
```

Er tritt in dieser Zeile auf:


```
for (int i=1; i < punkteHash.size();i++)
```

Bedeutet dieser NullPointerException das an dieser Stelle kein Wert ist?
Und dieser folglich null ist?

[EDIT]// Scheinbar schreibt das Programm nichts ins Hashtable[/edit]


----------



## Gast2 (17. Dez 2011)

Die Exception bedeutet dass punkteHash null ist.


```
Maexchen spiel = new Maexchen();
        Maexchen punkte = new Maexchen();
        Maexchen ausgabe = new Maexchen();
```
Du erzeugst hier auch drei verschiedene Instanzen. Hast also auch drei unterschiedliche HashTables. in der Instanz ausgabe ist die HashTable dann noch null.


----------



## Final_Striker (17. Dez 2011)

dein 
	
	
	
	





```
punkteHash
```
ist null.


----------



## obelixpp (18. Dez 2011)

Das mit dem NullPointerException war ja wirklich nicht schwer ich muss einfach der der Referenz folgen und dieser Wert war null. Danke für den Hinweis.

Jetzt hänge ich an einem anderen Problem, ich habe bis jetzt immer gedacht wenn ich etwas in ein Hashtable gebe wird dies dort ohne irgendeinen Typ aufgenommen also gebe ich beispielsweise eine int Zahl dort hinein wird die Zahl dort nicht als solche aufgenommen sondern einfach als Objekt.
Deswegen verstehe ich grade nicht wieso ich diese Werte dann nicht einfach wieder aus dem HT herausnehmen kann und in etwas beliebiges konvertieren kann.


```
// Punkte werden ausgegeben
	public void punkteAusgeben()
	{
			for (int i=1; i <= punkteHash.size();i++) 
			{	
				aktPunkte = Integer.parseInt((String) punkteHash.get(i));
				sumPunkte = sumPunkte + aktPunkte;
			}
			System.out.println("Sie haben insgesamt "+sumPunkte+" erspielt.");
	}
```

als Fehlermeldung bekomme ich:


```
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
	at Aufgabe3.Maexchen.punkteAusgeben(Maexchen.java:64)
	at Aufgabe3.Maexchen.main(Maexchen.java:46)
```


----------



## guest0815 (18. Dez 2011)

Oben packst du ein Double rein, jetzt willst du einen String rausholen. Logisch, dass das nicht geht.


----------



## obelixpp (18. Dez 2011)

guest0815 hat gesagt.:


> Oben packst du ein Double rein, jetzt willst du einen String rausholen. Logisch, dass das nicht geht.



Wo packe ich einen String rein?
Sorry ich steh grad total aufem Schlach.

Ehrlicherweise muss ich gestehen das ich nicht wirklich weiß was diese Zeile macht:


```
aktPunkte = Integer.parseInt((String) punkteHash.get(i));
```

soweit ich es mir gedacht hatte soll diese Zeile, in die variable aktPunkte die vom Typ int ist den Inhalt von punkteHash an der Stelle i in einen Integer konvertieren und abspeichern.


```
// Die erreichten Punkte werden in eine Hashtable eingegeben.
	public void punkteEingeben()
	{
		System.out.println("runde: "+runde);
		System.out.println("punkte: "+punkte);
		punkteHash.put(runde, punkte);
		System.out.println("### Punkte: "+punkteHash.get(runde));
		runde++;
	}
	
		// Punkte werden ausgegeben
	public void punkteAusgeben()
	{
			for (int i=1; i <= punkteHash.size();i++) 
			{	
				aktPunkte = Integer.parseInt((String) punkteHash.get(i));
				sumPunkte = sumPunkte + aktPunkte;
			}
			System.out.println("Sie haben insgesamt "+sumPunkte+" erspielt.");
	}
```


----------



## obelixpp (18. Dez 2011)

So ich glaube ich habe das Problem gelöst, es funktioniert auf jeden fall.
Allerdings weiß ich natürlich nicht ob das jetzt halbwegs "schön" ist oder ob jemand anderes die Hände
überm Kopf zusammenschlagen würde.

Da ich die Daten die im HT sind ja anscheinend nur in Form eines Strings ausgeben lassen kann, 
habe ich diese Daten in einer Hilfsvariable gespeichert und diese dann später in einer zweiten hilfsvariablen in einen int Wert umgewandelt.


```
// Punkte werden ausgegeben
	public void punkteAusgeben()
	{
			for (int i=1; i <= punkteHash.size();i++) 
			{	
				String aktPunkte = punkteHash.get(i).toString();
				int aktPunkte1 = Integer.parseInt(aktPunkte);
				sumPunkte = sumPunkte + aktPunkte1;
			}
			System.out.println("Sie haben insgesamt "+sumPunkte+" erspielt.");
	}
```


----------

