# vocab1 = new JButton(""+voc1.get(nr).toString()+"");



## Java-Star (20. Jun 2014)

Hallo, also ich habe da ein Ausschnitt vom Programm, dass ich programmiert habe, und dann mit großer Hoffnung gestartet habe  Doch wie immer ist irgendetwas falsch, und wahrscheinlich ist es ein (kleiner) dummer Fehler.

Warum ist die Zeile 9 (auch im Titel) falsch?


```
boolean again = false;
			
			while(again == false) {
				
				nr = (int)(Math.random()*Vocabulary.length());
				if(zufälle[nr] == 0) {
					
					zufälle[nr] = 1;
					vocab1 = new JButton(""+voc1.get(nr).toString()+"");
					
					again = true;
					
					button1 = nr;
					
				}
				
			}
			again = false;
```

Wenn ich keine Methode toString benutze, klappt es genauso nicht. Ich denke, dass man den JButton nicht genauso benennen kann. ???:L (Habe ihn vorher natürlich initialisiert)
Hoffe, mir kann jemand helfen. Danke im Voraus!


----------



## Gucky (20. Jun 2014)

Was heißt "falsch"?
Was soll passieren?
Was passiert stattdessen?
Was hast du schon getan, um den Fehler einzugrenzen?
Was steht in den variablen?
Welche Fehlermeldungen bekommst du? Bei Exceptions inlusive StackTrace.

Beantworte bitte diese Fragen. Dann können wir dir besser helfen 

Das, was du versuchst, ist einem Button eine Aufschrift zu geben. Theoretisch kannst du auch tausend Buttons mit derselben Aufschrift machen.


----------



## Java-Star (21. Jun 2014)

Ok,

habe vielleicht vergessen, zu sagen, dass voc1 eine Arraylist ist, und dass ich versuchen wollte, einen bestimmten Eintrag der Arraylist, als Beschriftung für den Button zu nutzen.

Dies steht immer, wenn ich das Programm starten will:
at java.util.ArrayList.rangeCheck(Unknown Source)
	at java.util.ArrayList.get(Unknown Source)
               (+ Zeilenangabe)

In der Variable voc1 stehen nur Strings und wenn ich das Programm starte, passiert stattdessen nichts.
Doch da das Fenster dann noch nicht einmal gezeigt wird, kann ich auch nicht wissen, ob die Buttons überhaupt zu sehen wären.


----------



## Harry Kane (21. Jun 2014)

Also wenn voc1 eine ArrayList<String> ist, reicht 
	
	
	
	





```
voc1.get(nr)
```
 aus. Das toString() sowie die zusätzlichen Leerzeichen davor oder danach sind überflüssig.
Beim posten von stack traces bitte die vollständigen posten! In der ersten Zeile steht immer der Klassenname und die Message der Exception, welche bei dir fehlen.
Ich denke, das voc1 nicht die benötigten Einträge enthält.
Was mich stutzig macht, ist das nr über 
	
	
	
	





```
(int)(Math.random()*Vocabulary.length())
```
 ermittelt wird und dann aus voc1 ein Eintrag beschafft wird. Ich tippe darauf, daß Vocabulary.length() größer ist als voc1.size().


----------



## Java-Star (21. Jun 2014)

Wenn ich die nr mit der Größe von voc1 machen will, ist es immer noch falsch.
Ich zeige jetzt mal das ganze Programm. Es ist (für mich ^^) sehr groß und mein erster Versuch, einen Vokabeltrainer zu basteln. Hab wahrscheinlich sehr vieles umständlich gemacht, aber es soll halt funktionieren, und das tut es bis jetzt noch nicht:


```
package Packet1;

import javax.swing.*;

public class Fenster {
	
	public static void main(String[] args) {
		
		Vokabeln fenster = new Vokabeln();
		fenster.setSize(500,500);
		fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		fenster.setVisible(true);
		
	}

}
```

das war das Hauptprogramm zum starten des Fensters
und jetzt die ganzen Methoden und der Konstruktor:


```
package Packet1;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

import javax.swing.Box;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class Vokabeln extends JFrame implements ActionListener{
	
	final String Vokabeln = "c:\\Benutzer\\User\\workspace\\Vokabeln.txt";
	final String Vocabulary = "c:\\Benutzer\\User\\workspace\\Vocabulary.txt";
	
	private ArrayList voc1 = new ArrayList();
	private ArrayList voc2 = new ArrayList();
	
	private int deutsch = 0;
	private int[] vergleich1; // wird eigentlich nicht gebraucht (nur, wenn man mehrere Deutsche Variablen machen will
	private int[] vergleich2;
	
	private int[] zufälle;
	
	private JButton vocab;
	private JButton vocab1;
	private JButton vocab2;
	private JButton vocab3;
	
	private int button1;
	private int button2;
	private int button3;
	
	private Box box1;
	private Box box2;
	private JPanel trainer;
	
	private String zufall;
	
	private String zufall1;
	private String zufall2;
	private String zufall3;
	
	private int nr;
	
	public Vokabeln() {
		
		readVocs();
		setDeutsch();
		set3Buttons();
		
		vocab.setPreferredSize(new Dimension (200,60));
		vocab.addActionListener(this);
		box1 = Box.createHorizontalBox();
		box1.setPreferredSize(new Dimension(300,200));
		
		box1.add(vocab);
		trainer.add(box1);
		
		reihenfolge();
		
		setContentPane(trainer);
	}
	
	public void readVocs() {
		
		try {
			
			vergleich1 = new int[Vokabeln.length()];
			for(int i = 0; i < Vokabeln.length(); i++) {
				
				vergleich1[i] = 0;
			}
			
			int nr = 0;
			boolean dateiende = false;
			
			BufferedReader datei1 = new BufferedReader(new FileReader(Vokabeln));
			String zeile = datei1.readLine();
			
			while(!dateiende) {
				
				if (zeile == null){
					dateiende = true;
				}
				else {
					voc1.add (zeile);
					vergleich1[nr] = nr;
				}
				nr++;
				
			}
			
		}
		catch(IOException verbindung) {
			
			System.out.println("Konnte Daten nicht finden!");
			
		}
		
		try {
			
			vergleich2 = new int[Vocabulary.length()];
			for(int i = 0; i < Vocabulary.length(); i++) {
				
				vergleich2[i] = 0;
			}
			
			int nr = 0;
			boolean dateiende = false;
			
			BufferedReader datei1 = new BufferedReader(new FileReader(Vocabulary));
			String zeile = datei1.readLine();
			
			while(!dateiende) {
				
				if (zeile == null){
					dateiende = true;
				}
				else {
					voc2.add (zeile);
					vergleich2[nr] = nr;
				}
				nr++;
				
			}
			
		}
		catch(IOException verbindung) {
			
			System.out.println("Konnte Daten nicht finden!");
			
		}
		
	}
		
		public void setDeutsch() {
			
			nr = (int)(Math.random()*Vokabeln.length());
			deutsch = nr;
			
			vocab = new JButton(""+voc1.get(deutsch)+""); // HIER!
			
			zufälle = new int[Vokabeln.length()];
			
			for(int i = 0; i < Vokabeln.length(); i++) {
				
				zufälle[nr] = 0;
				
			}
			
		}
		
		public void set3Buttons() {
			
			boolean again = false;
			
			while(again == false) {
				
				nr = (int)(Math.random()*Vocabulary.length());
				if(zufälle[nr] == 0) {
					
					zufälle[nr] = 1;
					vocab1 = new JButton(""+voc1.get(nr)+"");
					
					again = true;
					
					button1 = nr;
					
				}
				
			}
			again = false;
			
			while(again == false) {
				
				nr = (int)(Math.random()*Vocabulary.length());
				if(zufälle[nr] == 0) {
					
					zufälle[nr] = 1;
					
					
					vocab2 = new JButton(""+voc1.get(nr)+"");;
					
					again = true;
					
					button2 = nr;
					
				}
				
			}
			again = false;
           
			do {
				
				int i = (int) (Math.random()*Vocabulary.length());
				
				if(i == deutsch) {
					
					vocab3 = new JButton(""+voc1.get(i)+"");
					again = true;
					
					button3 = i;
					
				}
				
			}
			while(again == false);
			again = false;
			
		}
		
		public void reihenfolge() {
			
			boolean ende = false;
			
			boolean eins = false;
			boolean zwei = false;
			boolean drei = false;
			
			int folge;
			
			while(ende == false) {
				
				folge = (int) (Math.random()*3);
				if(folge == 0) {
					
					vocab1.setPreferredSize(new Dimension (200,60));
					vocab1.addActionListener(this);
					eins = true;
					
					folge = (int) (Math.random()*3);
				}
				
				if(folge == 1) {
					
					vocab2.addActionListener(this);
					vocab2.setPreferredSize(new Dimension (200,60));
					zwei = true;
					
					folge = (int) (Math.random()*3);
				}
				
				if(folge == 2) {
					
					vocab3.setPreferredSize(new Dimension (200,60));
					vocab3.addActionListener(this);
					drei = true;
					
					folge = (int) (Math.random()*3);
				}
				
				if((eins == true) && (zwei == true) && (drei == true)) {
					
					ende = true;
				}
			}
			
			box2 = Box.createHorizontalBox();
			box2.setPreferredSize(new Dimension(700,600));
			box2.add(vocab1);
			box2.add(vocab2);
			box2.add(vocab3);

			trainer.add(box2);
			
		}
		
		public void actionPerformed(ActionEvent wahl) {
			
			if(vocab1 == wahl.getSource()) {
				
			while(deutsch == deutsch)
				
				if(deutsch == button3) {
					
					JOptionPane.showMessageDialog(null, "Das ist richtig!");
					
					deutsch = 123;
					
				}
				else {
					
					JOptionPane.showMessageDialog(null, "Das ist falsch, versuch's doch noch mal.");
				}
			
			}
			
		}
		
}
```

Es soll einen Deutschen Button geben, der aber noch nichts macht und drei Englische, einer davon ist richtig. Sehr wahrscheinlich habe ich viele überflüssige Variablen gemacht. 

Bin noch neu in Java, deshalb bin ich auch immer bereit für Verbesserungsvorschläge.


----------



## Gucky (21. Jun 2014)

Kannst du bitte noch mal die GESAMTE Exception posten?


----------



## Java-Star (21. Jun 2014)

Also jetzt bekomme ich erst einen OutOfBounds, seit dem ich die Speicherdatei noch mal erneuert habe und auch den Speicherplatz:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 12
	at Packet1.Vokabeln.readVocs(Vokabeln.java:95)
	at Packet1.Vokabeln.<init>(Vokabeln.java:55)
	at Packet1.Fenster.main(Fenster.java:9)

Heißt das nicht, dass ich die ArrayListen irgendwie falsch initialisiert habe, oder sie nicht mit 0 beginnen? Wie gesagt, ich bin noch Anfänger. Aber Mal so eine Frage: Ist das Programm gut? Oder eher schlecht?


----------



## Gucky (21. Jun 2014)

Lass dir mal sämtliche Befüllungen der ArrayList bestätigen und lass dir anzeigen, wie groß die ArrayList ist.


----------



## Java-Star (21. Jun 2014)

Also danke für den tipp  ich hab sie jetzt mal mit System.out.println ausgegeben und den Fehler behoben (man muss den String zeile in der while Schleife initialisieren), doch jetzt kommt eine neue Exception:

Exception in thread "main" java.lang.NullPointerException
	at Packet1.Vokabeln.set3Buttons(Vokabeln.java:171)
	at Packet1.Vokabeln.<init>(Vokabeln.java:56)
	at Packet1.Fenster.main(Fenster.java:9)

Wahrscheinlich ist das wieder nicht so knifflig, aber ein erneuter Tipp wäre sehr nett.


----------



## Harry Kane (21. Jun 2014)

Da hab ich ja fast richtig gelegen mit meiner Vermutung. Aber nur fast.
Also: "Vokabeln" ist ein String, der einen Dateipfad darstellt. Mir der Länge dieses Strings wird das array vergleich1 initialisiert. Wenn du die Datei in deiner readVocs() zeilenweise einliesst, für jede Zeile einen Zähler hochsetzt und dann auf vergleich1[nr] zugreifst, geht das nur gut, wenn die Datei weniger Zeilen hat als ihr Pfadname an Buchstaben.


----------



## Java-Star (21. Jun 2014)

Ja... Verstehe ich nicht ganz.

Ich habe die zwei Arrays vergleich1 und vergleich2 entfernt, da mir aufgefallen ist, dass ich sie gar nicht brauche. (glaube ich)

Also stelle ich noch einmal das Programm vor und hoffe darum, dass mir jemand den Fehler:

Programm:

```
package Packet1;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

import javax.swing.Box;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class Vokabeln extends JFrame implements ActionListener{
	
	final String Vokabeln = "Vokabeln.txt";
	final String Vocabulary = "Vocabulary.txt";
	
	private ArrayList voc1 = new ArrayList();
	private ArrayList voc2 = new ArrayList();
	
	private int deutsch = 0;
	
	private int[] zufälle;
	
	private JButton vocab;
	private JButton vocab1;
	private JButton vocab2;
	private JButton vocab3;
	
	private int button1;
	private int button2;
	private int button3;
	
	private Box box1;
	private Box box2;
	private JPanel trainer;
	
	private String zufall;
	
	private String zufall1;
	private String zufall2;
	private String zufall3;
	
	private int nr;
	
	public Vokabeln() {
		
		readVocs();
		set3Buttons();
		reihenfolge();
		
		vocab.setPreferredSize(new Dimension (200,60));
		vocab.addActionListener(this);
		box1 = Box.createHorizontalBox();
		box1.setPreferredSize(new Dimension(300,200));
		
		box1.add(vocab);
		trainer.add(box1);
		
		reihenfolge();
		
		setContentPane(trainer);
	}
	
	public void readVocs() {
		
		try {
			
			boolean dateiende = false;
			
			BufferedReader datei1 = new BufferedReader(new FileReader(Vokabeln));
			
			
			while(!dateiende) {
				
				String zeile = datei1.readLine();
				
				if (zeile == null){
					dateiende = true;
				}
				else {
					voc1.add (zeile);
				}
				
			}
			
		}
		catch(IOException verbindung) {
			
			System.out.println("Konnte Daten nicht finden!");
			
		}
		
		try {
			
			boolean dateiende = false;
			
			BufferedReader datei1 = new BufferedReader(new FileReader(Vocabulary));
			
			while(!dateiende) {
				
				String zeile = datei1.readLine();
				
				if (zeile == null){
					dateiende = true;
				}
				else {
					voc2.add (zeile);
				}
				
			}
			
		}
		catch(IOException verbindung) {
			
			System.out.println("Konnte Daten nicht finden!");
			
		}
		
	}
		
		public void setDeutsch() {
			
			nr = (int)(Math.random()*Vokabeln.length());
			deutsch = nr;
			
			vocab = new JButton(""+voc1.get(deutsch)+"");
			
			//
			
			zufälle = new int[Vokabeln.length()];
			
			for(int i = 0; i < Vokabeln.length(); i++) {
				
				zufälle[nr] = 0;
				
			}
			
		}
		
		public void set3Buttons() {
			
			boolean again = false;
			
			while(again == false) {
				
				nr = (int)(Math.random()*Vocabulary.length());
				if(zufälle[nr] == 0) {
					
					zufälle[nr] = 1;
					vocab1 = new JButton(""+voc2.get(nr)+"");
					
					again = true;
					
					button1 = nr;
					
				}
				
			}
			again = false;
			
			while(again == false) {
				
				nr = (int)(Math.random()*Vocabulary.length());
				if(zufälle[nr] == 0) {
					
					zufälle[nr] = 1;
					
					
					vocab2 = new JButton(""+voc2.get(nr)+"");;
					
					again = true;
					
					button2 = nr;
					
				}
				
			}
			again = false;
           
			do {
				
				int i = (int) (Math.random()*Vocabulary.length());
				
				if(i == deutsch) {
					
					vocab3 = new JButton(""+voc2.get(i)+"");
					again = true;
					
					button3 = i;
					
				}
				
			}
			while(again == false);
			again = false;
			
		}
		
		public void reihenfolge() {
			
			boolean ende = false;
			
			boolean eins = false;
			boolean zwei = false;
			boolean drei = false;
			
			int folge;
			
			while(ende == false) {
				
				folge = (int) (Math.random()*3);
				if(folge == 0) {
					
					vocab1.setPreferredSize(new Dimension (200,60));
					vocab1.addActionListener(this);
					eins = true;
					
					folge = (int) (Math.random()*3);
				}
				
				if(folge == 1) {
					
					vocab2.addActionListener(this);
					vocab2.setPreferredSize(new Dimension (200,60));
					zwei = true;
					
					folge = (int) (Math.random()*3);
				}
				
				if(folge == 2) {
					
					vocab3.setPreferredSize(new Dimension (200,60));
					vocab3.addActionListener(this);
					drei = true;
					
					folge = (int) (Math.random()*3);
				}
				
				if((eins == true) && (zwei == true) && (drei == true)) {
					
					ende = true;
				}
			}
			
			box2 = Box.createHorizontalBox();
			box2.setPreferredSize(new Dimension(700,600));
			box2.add(vocab1);
			box2.add(vocab2);
			box2.add(vocab3);

			trainer.add(box2);
			
		}
		
		public void actionPerformed(ActionEvent wahl) {
			
			if(vocab1 == wahl.getSource()) {
				
			while(deutsch == deutsch)
				
				if(deutsch == button3) {
					
					JOptionPane.showMessageDialog(null, "Das ist richtig!");
					
					deutsch = 123;
					
					System.exit(0);
					
				}
				else {
					
					JOptionPane.showMessageDialog(null, "Das ist falsch, versuch's doch noch mal.");
				}
			
			}
			
		}
		
}
```

Exception:

Exception in thread "main" java.lang.NullPointerException
	at Packet1.Vokabeln.set3Buttons(Vokabeln.java:153)
	at Packet1.Vokabeln.<init>(Vokabeln.java:54)
	at Packet1.Fenster.main(Fenster.java:9)

erklären kann. Danke!


----------



## Harry Kane (21. Jun 2014)

Die NPE ist doch eindeutig: Du hast das Array zufälle zwar deklariert, aber nicht initialisiert.
Und was dein Kommentar zu meinem letzten post angeht: Was genau hast du an meiner Antowrt nicht verstanden? Ich gebe zu, meine Erklärung ist ein bisschen kompliziert. Das liegt aber nur daran weil das was du zusammenprogrammiert hast, nicht einfach zu erklären ist.
Aber wahrscheinlich hat sich dein Ursprungsproblem mit dem entfernen der beiden vergleich-Arrays eh erledigt.


----------



## Java-Star (21. Jun 2014)

Also manchmal bin ich glaub ich zu dumm fürs Programmieren ;(

Ich hab vergessen, im Konstruktor die Methode setDeutsch(); zu benutzen. Jetzt habe ich wieder einen Exception, den ich schon vorhin hatte:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 11, Size: 4
	at java.util.ArrayList.rangeCheck(Unknown Source)
	at java.util.ArrayList.get(Unknown Source)
	at Packet1.Vokabeln.setDeutsch(Vokabeln.java:132)
	at Packet1.Vokabeln.<init>(Vokabeln.java:54)
	at Packet1.Fenster.main(Fenster.java:9)

Kann mir bitte jemand diese Meldung (für dummies) erklären? 

Tut mir leid für diese ganzen Missverständnisse (obwohl ja manche Sachen geklärt wurden) und vielen Dank für weitere Hilfe. :toll:


----------



## Java-Star (21. Jun 2014)

Also wenn voc1 eine ArrayList<String> ist, reicht voc1.get(nr) aus. Das toString() sowie die zusätzlichen Leerzeichen davor oder danach sind überflüssig.
Beim posten von stack traces bitte die vollständigen posten! In der ersten Zeile steht immer der Klassenname und die Message der Exception, welche bei dir fehlen.
Ich denke, das voc1 nicht die benötigten Einträge enthält.
Was mich stutzig macht, ist das nr über (int)(Math.random()*Vocabulary.length()) ermittelt wird und dann aus voc1 ein Eintrag beschafft wird. Ich tippe darauf, daß Vocabulary.length() größer ist als voc1.size(). 

Das hast du einmal geschrieben. Ich werde jetzt erst einmal gucken, wie lang die beiden sind ^^


----------



## Harry Kane (21. Jun 2014)

Vocabulary.length() ist 14, Vokablen.length() ist 12. Das kann ich sogar von hier sehen, da die Variablen mit einem festen Wert belegt sind.
Stell sich die Frage, wie lang voc1 ist. voc1 hat so viele Elemente wie die Eingabedatei an Zeilen. Wie viele das sind, weiss man ur wenn man die Datei kennt.
Klar ist aber: wenn du weniger als 12 Zeilen hast, gibt es bei folgendem Code die Exception:

```
nr = (int)(Math.random()*Vokabeln.length());//ergibt eine Zahl zwischen 0 und 11
vocab = new JButton(""+voc1.get(nr)+"");//hier fliegt eine Exception wenn die Länge der ArrayList kleiner ist als 12.
```


----------



## Java-Star (22. Jun 2014)

Danke für die ganzen Antworten. Ich bin jetzt auch FAST fertig mit dem Projekt, aber mein neues Problem ist: wie bekomme ich eine zufällige Reihenfolge der Buttons? Ich habe mir überlegt, drei zahlen mit dem Zufallsprinzip auszuwählen und keine darf den selben Wert haben, wie die andere. z.B. 2,1,3

Das hat auch geklappt. Doch jetzt möchte ich eine Return Methode machen, die alle Befehle enthält, um alle Buttons in eine bestimmte Reihenfolge zu bringen. Doch ich weiß nicht, wie...  :bahnhof:
Kann mir jemand Tipps geben?


----------



## Java-Star (22. Jun 2014)

Es hat sich erledigt 

Ich hab es geschafft alleine geschafft!

Aber danke für die ganzen Tipps! :toll:


----------

