nullpointer exception

  • Themenstarter Themenstarter dyn
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
D

dyn

Gast
Hi, ich möchte eine Art Glücksrad programmieren.
Ich möchte mit den beiden Klassen "spieler" und "glücksrad" den Spielablauf simulieren.
Ich habe versucht es so objektorientiert wie möglich zu gestalten, sonst hätte ich wohl einfach alles in eine Klasse gepackt 😉
Da das quasi mein erstes eigenes Programm ist bin ich was das angeht noch ein wenig unsicher und habe das ganze erstmal über System.out.println gemacht ohne GUI-Anbindung und ohne Überprüfung ob der gewählte Buchstabe im gesuchten Begriff vorhanden ist.

Von daher würde ich mich sehr freuen, wenn ihr mir sagen könntet,

1. wieso ich beim Kompilieren der glücksrad.class folgende Fehlermeldung bekomme(ich steig einfach nicht mehr durch):

Exception in thread "main" java.lang.NullPointerException
at glücksrad.naechster(glücksrad.java:42)
at glücksrad.<init>(glücksrad.java:29)
at glücksrad.main(glücksrad.java:65)

2. ob es überhaupt Sinn macht den Spielablauf ungefähr so gestalten zu wollen oder ob das ein schlechter Programmierstil ist.

3. wie ich einen Namen, den ich in einer anderen Klasse über ein Textfeld einlesen lasse, so übergebe, dass die Spieler eben nicht Mannfred, Klaus und Bernd heißen, sondern den Namen bekommen, der ins Textfeld eingebeben wird.


Code:
public class glücksrad {
	
	Spieler spieler1;
	Spieler spieler2;
	Spieler spieler3;
	int aktuellerSpieler = 2; 
	String aktuellerName;
     
    
     public glücksrad () 

     { 
     	Spieler spieler1 = new Spieler("Mannfred", 0);
    	Spieler spieler2 = new Spieler("Klaus", 0);
    	Spieler spieler3 = new Spieler("Bernd", 0);
    	// Die methode naechster() soll quasi das Programm einleiten
         naechster();
     }
     
   

     // wer ist als nächstes dran? --> naechster 

     public void naechster()

     { 

           if (aktuellerSpieler == 2)  
            {
             spieler1.drehen();
             System.out.println(spieler1.getKontostand());
            } 

           if (aktuellerSpieler == 1)  
           {
            spieler2.drehen();  
            System.out.println(spieler2.getKontostand());
           } 
           
           if (aktuellerSpieler == 2)  
           {
            spieler3.drehen();
            System.out.println(spieler3.getKontostand());
           } 

      }
     
     public static void main(String args[])
     {
     	new glücksrad();
     }

}

und

Code:
public class Spieler {
	
    protected String name;    // Name des Spielers
    protected int kontostand; // Kontostand Spieler 1
    int zahl;			     // Zufallszahl für gedrehtes Feld 	
    String felder[] = { "Pleite :-P", "500", "200", "1000", "200", "Aussetzen", "Bonus", "2000", "Pleite :-P",
				 "500", "200", "5000", "1000", "Aussetzen", "Bonus", "2000"};
    
    glücksrad rad;
    

    //default Konstruktor
    public Spieler()
    {	
	   setName("");
	   setKontostand(0);
	   glücksrad rad = new glücksrad();
    }
    
    
    public Spieler (String name, int kontostand)
	{
     setName(name);
     setKontostand(kontostand);
    }
    	
    	  
    	public void setName(String name)

    	{ 
    	 this.name = name;  
    	}     
    
        
    		public String getName()

    	     { 
  	          return name;  
    	     }
    		
    		    		
    		public void setKontostand(int kontostand)
    		{
    			this.kontostand = kontostand;
    		}
    		
    		public int getKontostand()
    		{
    			return kontostand;
    		}
    		    		    		  
    		  public void drehen()
    	        {
    	        	 for (int i = 0; i<=10; i++)
    	   		   {
    	   		   zahl = (int) (Math.random() * 16);
    	   	       String feld = felder[zahl];
    	   	       }
    	        	 
                    // Bankrott
    		  if (zahl == 0 || zahl == 8)
	   	      {
	   	      	kontostand = 0;
	   	      	rad.naechster();
	   	      }
	   	      // Aussetzen  	  	      	
	   	      if (zahl == 5 || zahl == 13)
	   	       {
	   	      	rad.naechster();
	   	       }
	   	      	   	      	   	      	
	   	      	
	   	      // "Bonus" ist noch nicht implementiert, erstmal wie "aussetzen"
	   	      if (zahl == 6 || zahl == 14)
	   	      	{
	   	      		rad.naechster();
	   	      	}
	   	      	
	   	      	  	      	
	   	      	switch (zahl)
				{
	   	      	 case 1: case 9:  kontostand += 500;
	   	      	 case 2: case 4: case 10: kontostand += 200;
	   	      	 case 3: case 12: kontostand += 1000;
	   	      	 case 7: case 15: kontostand += 2000;
	   	      	 case 11: kontostand = 5000;
				}
	   	      	
	   	       }
    		  
    		  


	}

:###
 
der fehler liegt im konstruktor von glücksrad bei der instanzierung der spieler objekte. du erzeugst lokale objekte anstatt die felder zu initialisieren. versuchs stattdessen mal mit:

Code:
public glücksrad () {
   spieler1 = new Spieler("Mannfred", 0);
   spieler2 = new Spieler("Klaus", 0);
   spieler3 = new Spieler("Bernd", 0);
   naechster();
}


ps: mach in zukunft klassennamen immer mit nem großen anfangsbuchstaben.
 
Ich finds lustig, dass plötzlich alle am Glücksrad proggen sind 🙂... gab schon andere Threads über dieses Thema..
z.B. der hier: http://www.java-forum.org/de/viewtopic.php?t=20843&highlight=

Zu deiner 1. Frage: schätze mal du hast ein String[] mit 16 Elementen, erzeugst aber mit zahl = (int) (Math.random() * 16); nen Index von 0-16... (obwohl, sollte das nicht eher ne oob excepiton schmeissen ? ). Probier jedenfalls das mal aus, vielleicht änderts ja was....

Zu 2: Ich finds ok. 🙂

Den Text vom TextFeld holst du dir mit getText() und dann übergibtst du ihn einfach deiner Klasse Spieler...
 
lin hat gesagt.:
Zu deiner 1. Frage: schätze mal du hast ein String[] mit 16 Elementen, erzeugst aber mit zahl = (int) (Math.random() * 16); nen Index von 0-16... (obwohl, sollte das nicht eher ne oob excepiton schmeissen ? ). Probier jedenfalls das mal aus, vielleicht änderts ja was....

jo, das würde ne ArrayIndexOutOfBoundsException geben und keine nullpointer. 😉
 
Habe den Code jetzt ein wenig geändert - bekomme allerdings immernoch exceptions

Code:
public class glücksrad {
	
	Spieler spieler1;
	Spieler spieler2;
	Spieler spieler3;
	int aktuellerSpieler = 2; 
	String aktuellerName;
     
    
     public glücksrad () 

     { 
     	spieler1 = new Spieler("Mannfred", 0);
    	spieler2 = new Spieler("Klaus", 0);
    	spieler3 = new Spieler("Bernd", 0);
    	naechster();
     }
     
   

     // wer ist als nächstes dran? --> naechster 

     public void naechster()

     { 

           if (aktuellerSpieler == 2)  
            {
           	 spieler1.drehen();
           	 System.out.println(spieler1.getKontostand());
           	 aktuellerSpieler = 1;
            } 

           if (aktuellerSpieler == 1)  
           {
           	spieler2.drehen();  
            System.out.println(spieler2.getKontostand());
            aktuellerSpieler = 2;
           } 
           
           if (aktuellerSpieler == 2)  
           {
           	spieler3.drehen();
            System.out.println(spieler3.getKontostand());
            aktuellerSpieler = 3;
           } 

      }
     
     public static void main(String args[])
     {
     	new glücksrad();
     }
     
    	
     	
}

Code:
public class Spieler {
	
	protected String name;    // Name des Spielers
    protected int kontostand; // Kontostand Spieler 1
  	int zahl;				// Zufallszahl für gedrehtes Feld 	
    String felder[] = { "Pleite :-P 1", "500 2", "200 3", "1000 4", "200 5", "Aussetzen 6", "Bonus 7", "2000 8", "Pleite :-P 9",
				 "500 10", "200 11", "5000 12", "1000 13", "Aussetzen 14", "Bonus 15", "2000 16"};
    
    glücksrad rad;
    
    public Spieler()
    {	
       this("", 0);
	   rad = new glücksrad();
    }
    
    
    public Spieler (String name, int kontostand)
	{
     setName(name);
     setKontostand(kontostand);
    }
    	
    	  
    	public void setName(String name)

    	{ 
    	 this.name = name;  
    	}     
    
        
    		public String getName()

    	     { 
  	          return name;  
    	     }
    		
    		    		
    		public void setKontostand(int kontostand)
    		{
    			this.kontostand = kontostand;
    		}
    		
    		public int getKontostand()
    		{
    			return kontostand;
    		}
    		    		    		  
    		  public void drehen()
    	        {
    	        	 for (int i = 0; i<=10; i++)
    	   		   {
    	   		   zahl = (int) (Math.random() * 16);
    	   	       String feld = felder[zahl];
    	   	       }
    	        	 
    		  if (zahl == 0 || zahl == 8)
	   	      {
	   	      	kontostand = 0;
	   	      	rad.naechster();
	   	      }
	   	      	  	      	
	   	      if (zahl == 5 || zahl == 13)
	   	       {
	   	      	rad.naechster();
	   	       }
	   	      	   	      	   	      	
	   	      	
	   	      //ursprünglich extradreh - muss neu implementiert werden!
	   	      if (zahl == 6 || zahl == 14)
	   	      	{
	   	      		rad.naechster();
	   	      	}
	   	      	
	   	      	  	      	
	   	      	switch (zahl)
				{
	   	      	 case 1: case 9:  kontostand += 500;
	   	      	 case 2: case 4: case 10: kontostand += 200;
	   	      	 case 3: case 12: kontostand += 1000;
	   	      	 case 7: case 15: kontostand += 2000;
	   	      	 case 11: kontostand = 5000;
				}
	   	      	
	   	       }
    		  }
 
habs nochmal verändert.

mir wurde gesagt "du instantiierst eine Spieler klasse und von dort aus instantiierst du ein glücksrad und von dort aus eine Spieler klasse und von dort aus instantiierst du ein glücksrad und von dort aus eine Spieler klasse und von dort aus instantiierst du ein glücksrad und von dort aus eine Spieler klasse und von dort aus instantiierst du ein glücksrad und von dort aus eine Spieler klasse und von dort aus instantiierst du ein glücksrad und von dort aus"

jo. und jetzt? 😀



Code:
public class Spieler {
	
	protected String name;    // Name des Spielers
    protected int kontostand; // Kontostand Spieler 1
  	int zahl;				// Zufallszahl für gedrehtes Feld 	
    String felder[] = { "Pleite :-P 1", "500 2", "200 3", "1000 4", "200 5", "Aussetzen 6", "Bonus 7", "2000 8", "Pleite :-P 9",
				 "500 10", "200 11", "5000 12", "1000 13", "Aussetzen 14", "Bonus 15", "2000 16"};
    
    glücksrad rad;
    
    public Spieler()
    {	
       this("", 0);
	}
    
    
    public Spieler (String name, int kontostand)
	{
     setName(name);
     setKontostand(kontostand);
     rad = new glücksrad();
    }
    	
    	  
    	public void setName(String name)

    	{ 
    	 this.name = name;  
    	}     
    
        
    		public String getName()

    	     { 
  	          return name;  
    	     }
    		
    		    		
    		public void setKontostand(int kontostand)
    		{
    			this.kontostand = kontostand;
    		}
    		
    		public int getKontostand()
    		{
    			return kontostand;
    		}
    		    		    		  
    		  public void drehen()
    	        {
    	        	 for (int i = 0; i<=10; i++)
    	   		   {
    	   		   zahl = (int) (Math.random() * 16);
    	   	       String feld = felder[zahl];
    	   	       }
    	        	 
    		  if (zahl == 0 || zahl == 8)
	   	      {
	   	      	kontostand = 0;
	   	      	rad.naechster();
	   	      }
	   	      	  	      	
	   	      if (zahl == 5 || zahl == 13)
	   	       {
	   	      	rad.naechster();
	   	       }
	   	      	   	      	   	      	
	   	      	
	   	      //ursprünglich extradreh - muss neu implementiert werden!
	   	      if (zahl == 6 || zahl == 14)
	   	      	{
	   	      		rad.naechster();
	   	      	}
	   	      	
	   	      	  	      	
	   	      	switch (zahl)
				{
	   	      	 case 1: case 9:  kontostand += 500;
	   	      	 case 2: case 4: case 10: kontostand += 200;
	   	      	 case 3: case 12: kontostand += 1000;
	   	      	 case 7: case 15: kontostand += 2000;
	   	      	 case 11: kontostand = 5000;
				}
	   	      	
	   	       }
    		  
    		  


	}

Code:
public class glücksrad {
	
	Spieler spieler1;
	Spieler spieler2;
	Spieler spieler3;
	int aktuellerSpieler = 2; 
	String aktuellerName;
     
    
     public glücksrad () 

     { 
     	spieler1 = new Spieler("Mannfred", 0);
    	spieler2 = new Spieler("Klaus", 0);
    	spieler3 = new Spieler("Bernd", 0);
    	naechster();
     }
     
   

     // wer ist als nächstes dran? --> naechster 

     public void naechster()

     { 

           if (aktuellerSpieler == 2)  
            {
           	 spieler1.drehen();
           	 System.out.println(spieler1.getKontostand());
           	 aktuellerSpieler = 1;
            } 

           if (aktuellerSpieler == 1)  
           {
           	spieler2.drehen();  
            System.out.println(spieler2.getKontostand());
            aktuellerSpieler = 2;
           } 
           
           if (aktuellerSpieler == 2)  
           {
           	spieler3.drehen();
            System.out.println(spieler3.getKontostand());
            aktuellerSpieler = 3;
           } 

      }
     
     public static void main(String args[])
     {
     	new glücksrad();
     }
     
    	
     	
}
 
Funktionierts jetzt? Sry, hab grad keine Möglichkeit das auszutesten, aber ich wäre dankbar wenn du n'bisserl mehr schreiben könntest als "jo und jetzt?" 😉
 
ich übergebe anscheinend kein glücksrad an die spieler klasse sondern nur ein string und ein int!
 
Die erwartet ja auch nur ein string und ein int ?
Code:
public Spieler (String name, int kontostand)

Das Problem von deiner Endlos-Schleife ist aber, dass du im Konstruktor der Spieler-Klasse
Code:
rad = new glücksrad();
aufrufst und im Konstruktor der glücksrad-Klasse rufst du
Code:
spieler1 = new Spieler("Mannfred", 0);
und dann wird vom Konstruktor der Spieler Klasse wieder
Code:
new glücksrad()
aufgerufen und von dort wieder... 🙂
 
Code:
public class Spieler1 {
	
	String spielerName;     // Name des Spielers
    String aktuellerName;   // Name des aktuellen Spielers
    String Gewinner;        // Name des Gewinners
    int kontostand;      	    // Kontostand Spieler 1
    int gedreht;			// Erdrehter Betrag
    int aktuellerSpieler;   // Nummer des aktuellen Spielers  
    boolean buchstabe;		// Buchstabe vorhanden?
    boolean extradreh;		// Extradreh vorhanden?
    int zahl;				// Zufallszahl für gedrehtes Feld 	
    String felder[] = { "Pleite :-P 1", "500 2", "200 3", "1000 4", "200 5", "Aussetzen 6", "Bonus 7", "2000 8", "Pleite :-P 9",
				 "500 10", "200 11", "5000 12", "1000 13", "Aussetzen 14", "Bonus 15", "2000 16"};
    
    
    public Spieler1 (String pName)
	{
    	spielerName = pName;  
        aktuellerSpieler = 2;
	}
    	
    	  public String getName()

    	     { 
  	          aktuellerName = spielerName;  
    	      return aktuellerName;  
    	     }      	
    	
    	public void naechster()

        { 
              if (aktuellerSpieler== 2)  
               {
              	aktuellerSpieler  =  1;  
               } 

              if (aktuellerSpieler == 1)  
              {
              	aktuellerSpieler  =  2;  
              } 
              
              if (aktuellerSpieler == 2)  
              {
              	aktuellerSpieler  =  3;  
              } 

         }
    	
    	
    	
   	      
   	      
   	      
   		  
        	 
  }
Code:
public class glücksrad {
	
	Spieler spieler1;
	Spieler spieler2;
	Spieler spieler3;
	int aktuellerSpieler = 2; 
	String aktuellerName;
     
    
     public glücksrad () 

     { 
     	spieler1 = new Spieler("Mannfred", 0, this);
    	spieler2 = new Spieler("Klaus", 0, this);
    	spieler3 = new Spieler("Bernd", 0, this);
    	naechster();
     }
     
   

     // wer ist als nächstes dran? --> naechster 

     public void naechster()

     { 

           if (aktuellerSpieler == 2)  
            {
           	 spieler1.drehen();
           	 System.out.println(spieler1.getKontostand());
           	 aktuellerSpieler = 1;
            } 

           if (aktuellerSpieler == 1)  
           {
           	spieler2.drehen();  
            System.out.println(spieler2.getKontostand());
            aktuellerSpieler = 2;
           } 
           
           if (aktuellerSpieler == 2)  
           {
           	spieler3.drehen();
            System.out.println(spieler3.getKontostand());
            aktuellerSpieler = 3;
           } 

      }
     
     public static void main(String args[])
     {
     	new glücksrad();
     }
     
    	
     	
}
 
Code:
/*
 * Created on 27.08.2005
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */

/**
 * @author dyn
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class glücksrad {
	
	Spieler spieler1;
	Spieler spieler2;
	Spieler spieler3;
	int aktuellerSpieler = 2; 
	String aktuellerName;
     
    
     public glücksrad () 

     { 
     	spieler1 = new Spieler("Mannfred", 0, this);
    	spieler2 = new Spieler("Klaus", 0, this);
    	spieler3 = new Spieler("Bernd", 0, this);
    	naechster();
     }
     
   

     // wer ist als nächstes dran? --> naechster 

     public void naechster()

     { 

           if (aktuellerSpieler == 2)  
            {
           	 spieler1.drehen();
           	 System.out.println("Spieler1 Kontostand: "+spieler1.getKontostand());
           	 aktuellerSpieler = 1;
            } 

           if (aktuellerSpieler == 1)  
           {
           	spieler2.drehen();  
            System.out.println("Spieler2 Kontostand: "+spieler2.getKontostand());
            aktuellerSpieler = 2;
           } 
           
           if (aktuellerSpieler == 2)  
           {
           	spieler3.drehen();
            System.out.println("Spieler3 Kontostand: "+spieler3.getKontostand());
            aktuellerSpieler = 3;
           } 

      }
     
     public static void main(String args[])
     {
     	new glücksrad();
     }
     
    	
     	
}

Code:
public class Spieler {
	
	protected String name;    // Name des Spielers
    protected int kontostand; // Kontostand Spieler 1
  	int zahl;				// Zufallszahl für gedrehtes Feld 	
    String felder[] = { "Pleite :-P 1", "500 2", "200 3", "1000 4", "200 5", "Aussetzen 6", "Bonus 7", "2000 8", "Pleite :-P 9",
				 "500 10", "200 11", "5000 12", "1000 13", "Aussetzen 14", "Bonus 15", "2000 16"};
    
    glücksrad rad;
    
    public Spieler (String name, int kontostand, glücksrad rad)
	{
     setName(name);
     setKontostand(kontostand);
     this.rad = rad;
    }
    	
    	  
    	public void setName(String name)

    	{ 
    	 this.name = name;  
    	}     
    
        
    		public String getName()

    	     { 
  	          return name;  
    	     }
    		
    		    		
    		public void setKontostand(int kontostand)
    		{
    			this.kontostand = kontostand;
    		}
    		
    		public int getKontostand()
    		{
    			return kontostand;
    		}
    		    		    		  
    		  public void drehen()
    	        {
    	        	 for (int i = 0; i<=10; i++)
    	   		   {
    	   		   zahl = (int) (Math.random() * 16);
    	   	       String feld = felder[zahl];
    	   	       }
    	        	 
    		  if (zahl == 0 || zahl == 8)
	   	      {
	   	      	kontostand = 0;
	   	      	rad.naechster();
	   	      }
	   	      	  	      	
	   	      if (zahl == 5 || zahl == 13)
	   	       {
	   	      	rad.naechster();
	   	       }
	   	      	   	      	   	      	
	   	      	
	   	      //ursprünglich extradreh - muss neu implementiert werden!
	   	      if (zahl == 6 || zahl == 14)
	   	      	{
	   	      		rad.naechster();
	   	      	}
	   	      	
	   	      	  	      	
	   	      	switch (zahl)
				{
	   	      	 case 1: case 9:  kontostand += 500;
	   	      	 case 2: case 4: case 10: kontostand += 200;
	   	      	 case 3: case 12: kontostand += 1000;
	   	      	 case 7: case 15: kontostand += 2000;
	   	      	 case 11: kontostand = 5000;
				}
	   	      	
	   	       }
    		  
    		  


	}
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben