zufallszahlen in Array Speichern = Nullpointer exception

Kekzii

Mitglied
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:

Java:
	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
Java:
zahlen[i] =(int)zufall;

hoffe ihr könnt mir einen Tipp geben

mfg Kekzii
 
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
Java:
public void setZufall() {
    zahlen = new int[6];
    for(int i = 0;i<zahlen.length;i++){
        zahlen[i] = (int)(Math.random()*50);
    }
 
Zuletzt bearbeitet:
[c]zahlen[/c] wohl [c]null[/c] sein. Erstelle jeweils ein neues Array:
Java:
public void setZufall() {
    zahlen = new int[6];
    for(int i = 0;i < zahlen.length; i++){
        [...]
 
danke für die schnellen Antworten 🙂

wäre dies dann soweit richtig?

hier mal der gesamte bisherige code :
Java:
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
Java:
 	int[] zahlen = new int[6];
sagt das aus , dass das Array die länge 6 hat? also zahlen.length = 6?
 
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 😉
 
und dieses
Java:
 	int[] zahlen = new int[6];
sagt das aus , dass das Array die länge 6 hat? also zahlen.length = 6?

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:
Und ... richtig in dem Sinne, dass es sich ohne Exceptions ausführen läßt vermutlich (!) auch.
nönö 😀
 
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"


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 ^^
 
Lottozahlen garantiert ohne doppelte Werte:
Java:
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);
}
 
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"
 
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.
Java:
	for(int i = 0; i<zahlen.length; i++){
		zufall =  Math.random()*50;
		zahlen[i] =(int)zufall;
	}
 
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 🙁
 
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!
 
okay 😀 aber schreien musst du nich 😛

also nochmal mein programm inclusive main

Java:
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 🙂
 
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 😀
 
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 😀
 
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:

Java:
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!
 
Zuletzt bearbeitet:
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
 
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.
 
Zuletzt bearbeitet:
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 🙂

Java:
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

Java:
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();
	}
}
 
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:
Java:
 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.
Java:
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;
        } 
    }
 
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 =)
 

Neue Themen


Zurück
Oben