# zufallszahlen in Array Speichern = Nullpointer exception



## Kekzii (6. Jul 2010)

Hay 
folgendes Problem :

ich möchte 6zufallszahlen erzeugen und diese in ein Array speichern nur leider bekomme ich immer eine NullpointerException und ich verstehe nicht wirklich wieso..

hiermal der Code-ausschnitt wo der Fehler entsteht:


```
public void setZufall() {
		for(int i = 1;i<= 6;i++){
		this.zufall =  Math.random();
		this.zufall *= 50;
		zufall = (int) zufall;
		if(zufall > 49){
			zufall = 49;
		}
		zahlen[i] =(int)zufall;
		}
	}
```

Nun die fehler-Meldung kommt an der stelle 
	
	
	
	





```
zahlen[i] =(int)zufall;
```

hoffe ihr könnt mir einen Tipp geben

mfg Kekzii


----------



## Marco13 (6. Jul 2010)

Weil der Array 'null' ist. Am Anfang der Methode ein
zahlen = new int[6];
sollte es tun...

EDIT: Die Schleifengrenzen sind noch falsch (0 bis <6, nicht 1 bis <=6). Und sonst, etwas... kürzer

```
public void setZufall() {
    zahlen = new int[6];
    for(int i = 0;i<zahlen.length;i++){
        zahlen[i] = (int)(Math.random()*50);
    }
```


----------



## faetzminator (6. Jul 2010)

[c]zahlen[/c] wohl [c]null[/c] sein. Erstelle jeweils ein neues Array:

```
public void setZufall() {
    zahlen = new int[6];
    for(int i = 0;i < zahlen.length; i++){
        [...]
```


----------



## Michael... (6. Jul 2010)

Wo und wie ist denn *zahlen* deklariert?

Was soll das:


Kekzii hat gesagt.:


> ```
> zufall = (int) zufall;
> if(zufall > 49){
> zufall = 49;
> ...



Ansonten fangen Arrays immer mit dem Index 0 an und so was ist auch recht gefährlich


Kekzii hat gesagt.:


> ```
> for(int i = 1;i<= 6;i++){
> ```


besser

```
for (int i=0; i<zahlen.length; i++)
```


----------



## Kekzii (6. Jul 2010)

danke für die schnellen Antworten 

wäre dies dann soweit richtig?

hier mal der gesamte bisherige code :

```
public class Lotto {
	double zufall;
	int[] zahlen = new int[6];
	int[] einZahlen;
	public double getZahlen() {
		return zufall;
	}
	public void setZufall() {
		for(int i = 1;i<= zahlen.length;i++){
		this.zufall =  Math.random();
		this.zufall *= 50;
		if(zufall > 49){
			zufall = 49;
		}
		zahlen[i] =(int)zufall;
		}
	}	
		
}
```

und dieses 
	
	
	
	





```
int[] zahlen = new int[6];
```
sagt das aus , dass das Array die länge 6 hat? also zahlen.length = 6?


----------



## Marco13 (6. Jul 2010)

Syntaktisch richtig. D.h es compiliert.
Und ... richtig in dem Sinne, dass es sich ohne Exceptions ausführen läßt vermutlich (!) auch.
Nur dass beim Lotto keine Zahl mehrfach gezogen werden kann 

EDIT: Das mit der ArrayLänge: Ja.
EDIT2: Sozusagen  siehe nächste Antwort
EDIT3: Ja, die Arraygrenzen, hatte ich ja weiter oben schon gesagt. Testen wäre eine Möglichkeit


----------



## faetzminator (6. Jul 2010)

Kekzii hat gesagt.:


> und dieses
> 
> 
> 
> ...



Es _erzeugt_ ein neues Array von int's mit der Länge 6.

Nein, dein Code beginnt immer noch bei Index 1 und hört bei <length> auf. In allen gängigen Programmiersprachen beginnt der Index aber bei 0 und hört bei <length - 1> auf. Also statt [c]for(int i = 1;i<= zahlen.length;i++)[/c] verwende [c]for(int i = 0; i < zahlen.length; i++)[/c].

Edit: 





Marco13 hat gesagt.:


> Und ... richtig in dem Sinne, dass es sich ohne Exceptions ausführen läßt vermutlich (!) auch.


nönö


----------



## Kekzii (6. Jul 2010)

faetzminator hat gesagt.:


> Nein, dein Code beginnt immer noch bei Index 1 und hört bei <length> auf.



das habe ich bereits geändert nur kriege ich die Fehler-Meldung "java.lang.ArrayIndexOutOfBoundsException: 6" 




Marco13 hat gesagt.:


> Nur dass beim Lotto keine Zahl mehrfach gezogen werden kann


ja das weiss ich aber habe grade erst begonnen also war ich noch nicht so weit 

wollte ja erstmal sehen wie weit ich komme und momentan sehe ich einige Defizite bei mir ^^


----------



## Landei (6. Jul 2010)

Lottozahlen garantiert ohne doppelte Werte:

```
List<Integer> list = new ArrayList<Integer>();
for(int i = 1; i <= 49; i++) {
   list.add(i);
}
java.util.Collection.shuffle(list);
int[] zahlen = new int[6];
for(int i = 0; i < zahlen.length; i++) {
  zahlen[i] = list.remove(0);
}
```


----------



## ARadauer (6. Jul 2010)

> das habe ich bereits geändert nur kriege ich die Fehler-Meldung "java.lang.ArrayIndexOutOfBoundsException: 6"


ist das array 6 Elemente lang, gibt es kein Element 6, da du ja bei 0 anfängst...
0,1,2,3,4,5

for(int i = 1;i<= zahlen.length;i++){
muss so lauten
for(int i = 0; i < zahlen.length;i++){

ICh würd mir das so anfangen "von 0 bis kleiner länge"


----------



## Michael... (6. Jul 2010)

Die for Schleife läuft in den falschen Grenzen, ausserdem kannst Du dir diese if-Abfrage sparen, da Du aus der Zufalls sowie so ein int machst.

```
for(int i = 0; i<zahlen.length; i++){
		zufall =  Math.random()*50;
		zahlen[i] =(int)zufall;
	}
```


----------



## Kekzii (6. Jul 2010)

ups :bloed:

hab vergessen aus dem <= ein < zu machen 

jetzt bekomme ich folgende ausgabe 

//das sind alle zahlen einzelnd
Zahl0: 46.53426612762656
Zahl1: 22.357873834451738
Zahl2: 22.76751884598538
Zahl3: 13.868392420470482
Zahl4: 33.38451842419757
Zahl5: 11.241720365730218
//das is das Array
Zahlen : [I@1ddebc3

aber ich habe das doch gecasted zu einem int also dürften da doch keine komma-zahlen bei rum kommen oder?

EDIT: was is denn eine Arraylist  :bahnhof: da versteh ich doch nichts von :bahnhof: ich bin doch noch ein beginner


----------



## ARadauer (6. Jul 2010)

kekzii! wennst dich blöd anstellst, hilft dir niemand mehr! ;-)


> jetzt bekomme ich folgende ausgabe


was sollen wir mit der ausgabe, wenn wir das programm nicht kennen?
Wenn ich davon ausgehen, dass du hier einfach dein int array ausgibst... ist die ausgabe unmöglich



> was is denn eine Arraylist  da versteh ich doch nichts von  ich bin doch noch ein beginner


auch ein beginnner kann google fragen, was eine arraylist ist!


----------



## Kekzii (6. Jul 2010)

okay  aber schreien musst du nich 

also nochmal mein programm inclusive main


```
public class Lotto {
	double zufall;
	int[] zahlen = new int[6];
	int[] einZahlen;

	public int[] setZufall() {
		for(int i = 0;i< zahlen.length;i++){
		this.zufall =  Math.random();
		this.zufall *= 50;
		if(zufall > 49){
			zufall = 49;
			
			
		}
		zahlen[i] =(int) zufall ;
		System.out.println("Zahl" + i + ": " + (int)zufall);
		}
		return zahlen;
	}
```

Main:
[Java]

public class lotto_test {

	public static void main(String[] args){
		Lotto t = new Lotto();

		System.out.println("Zahl : " + t.setZufall());
	}
}[/code]

das mit dem googlen krieg ich hin 

denke das Programm is noch ein wenig unstrukturiert aber lesbar


----------



## Kekzii (6. Jul 2010)

Neues Problem 

ArrayList verstanden, ist aber erst ab JRE 1.5 verfügbar.. wäre nicht das Problem wenn ich hier auf dem PC installationsrechte hätte. Da diese nicht vorhanden sind, geht das wohl nicht 

gibts ne möglichkeit dies einfacher zu gestalten als durch tausend IF-abfragen?

ansonsten mache ich das jetzt einfach  auch wenns dann ein bisschen doof aussieht


----------



## faetzminator (6. Jul 2010)

Kekzii hat gesagt.:


> ArrayList verstanden, ist aber erst ab JRE 1.5 verfügbar.. wäre nicht das Problem wenn ich hier auf dem PC installationsrechte hätte. Da diese nicht vorhanden sind, geht das wohl nicht



Du hast was älteres ???:L
Egal, auf alle Fälle gabs die ArrayList schon, allerdings keine Generics  Entferne die <...>


----------



## Kekzii (6. Jul 2010)

Habe 1.4.2 
scheint für oracle zu reichen 

wenn ich die <...> weglasse dann meckert er und möchte eine lokale variable "Integer " erstellen, jedoch denke ich nich das das sinn und zweck der Sache ist 

ich glaube es wird wohl darauf hinaus laufen das ich doch tausend if abfragen machen muss :wuerg:

google konnte mir jetzt auch noch nicht dabei weiterhelfen


----------



## srea (6. Jul 2010)

Hmmm, warum tausend if-Abfragen? Prüfe in der for-Schleife mit einer andren For-Schleife ob die Zahl schon im Array ist, wenn ja neue Zufallszahl und prüfe nochmal. Müsste so ungefähr gehen:


```
public int[] setZufall() {

		for (int i = 0; i < zahlen.length; i++) {

			zufall = (Math.random()*49)+1;

			for (int j = 0; j < i; j++) {
				if ((int)zufall == zahlen[j]) {
					zufall = (Math.random()*49)+1;
					j = 0;
				}
			}
			zahlen[i] = (int)zufall;
		}
		return zahlen;
	}
```

Edit: Das mit um 1 erhöhen war quatsch, dann kann auch 50 bei raus kommen. Neue Zufallszahl generieren wenn Zahl schon vorhanden!


----------



## Kekzii (6. Jul 2010)

oder so =)

nur gibt der mir bei den Arrays immer wenn ich sie ausgeben will sowas aus wie " [I@14f8dab "
wobei das für mich unmöglich ist da ja lediglich Zahlen in den arrays stehen 

also woher nimmt er die sonderzeichen und Buchstaben


----------



## srea (6. Jul 2010)

Nicht einfach das Array ins sysout schreiben.
Mache eine for-schleife von [c]i=0[/c] bis [c]i<zahlen.length[/c] und gib immer [c]zahlen_[/c] aus._


----------



## truesoul (6. Jul 2010)

"[I@14f8dab" wird wohl die Referenz vom Array sein!?


----------



## Kekzii (6. Jul 2010)

AAAH okay  hätt ich selbst drauf kommen können 

muss erstmal wieder in JAVA reinkommen 
vielen dank für die Hilfe


----------



## Kekzii (6. Jul 2010)

soweit so gut  jetz hab ich hier mal ein wenig gezaubert

so wie es ausschaut funktioniert es aber ist sehr langsam oder es liegt an dem jetzigen PC 
ihr könnt es ja mal testen und mir eure Meinung sagen 


```
import java.io.IOException;

public class Lotto {
	double zufall;
	int[] zahlen = new int[6];
	int[] einZahlen = new int[6];
	int[] blubb = new int[6];
	int test, zähler;

	public void setZufall() {

		for (int i = 0; i < zahlen.length; i++) {

			zufall = (Math.random() * 49) + 1;

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

				if ((int) zufall == zahlen[j]) {
					zufall += 1;
					j = 0;
				}
			}

			zahlen[i] = (int) zufall;
		}

	}

	public void zahlenEingabe(int z1, int z2, int z3, int z4, int z5, int z6)
			throws IOException {
		einZahlen[0] = z1;
		einZahlen[1] = z2;
		einZahlen[2] = z3;
		einZahlen[3] = z4;
		einZahlen[4] = z5;
		einZahlen[5] = z6;

		for (int i = 0; i < zahlen.length; i++) {
			test = einZahlen[i];

			for (int k = 0; k < i; k++) {
				if (test == einZahlen[k]) {
					test += 1;
					k = 0;

				}

			}
			einZahlen[i] = test;
		}

	}

	public void vergleichen() {
		for (int z = 0; z < 6; z++) {
			for (int i = 0; i < zahlen.length; i++) {

				for (int k = 0; k < i; k++) {
					if (zahlen[i] == einZahlen[k]) {
						zähler += 1;
						k = 0;
					}
					i= 0;
				}
			}
		}

		for (int j = 0; j < zahlen.length; j++) {
			System.out.print(zahlen[j] + "  ");
		}
		System.out.println("");
		for (int z = 0; z < einZahlen.length; z++) {
			System.out.print(einZahlen[z] + "  ");
		}
		System.out.println("");
		System.out.println("Du hast " + zähler + "Richtige!");

	}

}
```

und die main


```
import java.io.IOException;




public class lotto_test {
	
	public static void main(String[] args) throws IOException{
		Lotto t = new Lotto();
		
		t.setZufall();
		t.zahlenEingabe(1,2,3,4,5,6);
		t.vergleichen();
	}
}
```


----------



## srea (6. Jul 2010)

Liegt nicht an deinem PC sondern an deiner [c]vergleichen()[/c] Methode. Die Funktionsweise der Methode versteh ich auch nicht wirklich. Würde so doch reichen:

```
public void vergleichen() {
        for (int z = 0; z < 6; z++) {
            for (int i = 0; i < zahlen.length; i++) {
            	if (einZahlen[z] == zahlen[i]) {
            		zähler++;
            	}
            }
        }
 
        for (int j = 0; j < zahlen.length; j++) {
            System.out.print(zahlen[j] + "  ");
        }
        System.out.println("");
        for (int z = 0; z < einZahlen.length; z++) {
            System.out.print(einZahlen[z] + "  ");
        }
        System.out.println("");
        System.out.println("Du hast " + zähler + " Richtige!"); 
    }
```
Was du machst ist, das du bei jeder richtigen Zahl k wieder auf 0 setzt und somit immer wieder von vorne die innerste for-Schleife durchläufst. Deshalb dauerts laaaaaange!

Und deine [c]setZufall()[/c] Methode würde ich so abändern wie ichs editiert habe in meinem Post.

```
public void setZufall() {
 
        for (int i = 0; i < zahlen.length; i++) {
 
            zufall = (Math.random() * 49) + 1;
 
            for (int j = 0; j < i; j++) { 
                if ((int) zufall == zahlen[j]) {
                    zufall = (Math.random() * 49) + 1; // wie im EDIT beschrieben.
                    j = 0;
                }
            } 
            zahlen[i] = (int) zufall;
        } 
    }
```


----------



## Kekzii (6. Jul 2010)

dein edit habe ich gar nicht gesehen :S

und zum ersten ich habs diese Woche nicht so mit dem denken 
irgendwie kam ich auf die idee das er nicht alle werte miteinander vergleicht und so falsche ergebnisse zustande kommen

ich werds mal so testen wie du es sagst 

vielen dank für die Rückmeldung =)


----------

