Wert ändert sich nicht

  • Themenstarter Themenstarter FranzFerdinand
  • Beginndatum Beginndatum
F

FranzFerdinand

Gast
Hallihallöle,

perfekt. Sieht etwas kompliziert aus, aber ich verstehe es. Da wäre ich nie drauf gekommen. Und auch Google war da nicht hilfreich.

Sodelle, aber ein kleines Problemle hab ich immer noch.
Schaut mal, so sieht meine Klasse aus:
Java:
package spiel;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.util.Arrays;

import javax.swing.Timer;

public class Spielverlauf extends CafeRoot{
	private static final long serialVersionUID = 7888790160235600024L;

	public Spielverlauf() throws IOException{
		super(spielname);
	}
	
	public static void doseingabeverarbeitung() {
		doseingabe = jTextFieldDosEingabe.getText();
		doseingabepart.addAll(Arrays.asList(doseingabe.split(":")));
		if (doseingabepart.size() > 3) {
			eingabeinkorrekt(5000);
		}
	}
	
	public static void doseingabefenster() throws IOException, InterruptedException {
		doseingabeverarbeitung();
		doseingabeerfolgt = true;
		switch(doseingabepart.get(0).toLowerCase()) {
		case "neustart":
			Spielstart.neustart();
			break;
		case "beenden":
			Spielstart.beenden();
			break;
		case "gastkartebar":
			String information = doseingabepart.get(1);
			barkartennummer = Integer.parseInt(information);
			System.out.println(information);
                        barkarten();
			break;
		default: doseingabeerfolgt = false;
		}
		if(doseingabeerfolgt == true) {
			jTextFieldDosEingabe.setText("");
			doseingabeerfolgt = false;
			jLabelMeldung.setText("");
		} else {
		eingabeinkorrekt(5000);
		}
	}
	
	public static void eingabeinkorrekt(int timerzeit) {
		jLabelMeldung.setText("Deine Eingabe war inkorrekt!");
		new Timer(timerzeit, new ActionListener() {
		public void actionPerformed(ActionEvent e) {
		jLabelMeldung.setText("");
		} } ).start();
	}
	
	public static void barkarten() {
		restbarplaetze -= 1;
		jListBarkartenModel.addElement(gastkarten.get(barkartennummer));
		System.out.println(barkartennummer);
		System.out.println(gastkarten.get(barkartennummer));
	}

}

Also ich habe eine Eingabebox namens "jTextFieldDosEingabe", die ihren Inhalt nach sofortigem eingeben und Enter klicken immer in String "doseingabe" umwandelt und ihn dann wie gesagt splittet. Wenn der Split mehr als Dreiteilig ist, weil ich maximal die Eingabe text1:text2:text3 zulasse, dann zeigt er an, dass die Eingabe falsch ist und löscht diese Ausgabe wieder nach 5 Sekunden. (siehe der 5000er Timer.)
Dieses Modell ist so, dass text1 immer der eigentliche Befehl ist, der herausgefiltert wird und text2 und text3 dann irgendwelche Parameter sind, auf die er reagieren soll, wenn 1. erkannt wurde.
Das mache ich mit dem Switch-Case:
Java:
switch(doseingabepart.get(0).toLowerCase()) {
Wie man sehen kann, wird beispielsweise wenn ich "neustart" eingebe die Klasse Spielstart.neustart() aufgerufen. Die startet mein Spiel neu. Ist nicht weiter wichtig. Es geht natürlich auch neustart:443:fsd, weil er nur das neustart als essentielle Eigenschaft braucht.

Wichtig ist jetzt folgendes:
Java:
case "gastkartebar":
			String information = doseingabepart.get(1);
			barkartennummer = Integer.parseInt(information);
			System.out.println(information);
                        barkarten();
			break;

Ich habe eine Liste mit gastkarten, die 100 Elemente enthält, die ich irgendwann im Spiel schon mal generiert habe, die auch nutzbar ist.
Und wenn ich den Befehl gastkartebar:x ausführe, soll er bitte das x-te Element dieser Liste rausfischen und es in mein jListBarkartenModel einfügen.

Wie man den dem Quelltext sieht, sucht er sich erst das Schlüsselwort gastkartebar raus.
Dann sucht er sich die Zahl raus, die dahinter stand (Element 1)und schreibt sie in den String information. Selbigen wandle ich dann in einen Integer um, namens barkartennummer.

So und dann rufe ich die barkarten()-Methode auf.

Java:
public static void barkarten() {
		restbarplaetze -= 1;
		jListBarkartenModel.addElement(gastkarten.get(barkartennummer));
		System.out.println(barkartennummer);
		System.out.println(gastkarten.get(barkartennummer));
	}
Die soll dann bitte bitte das Element aus der gastkarten-Liste in die jList einfügen. Dazu gettet er dann meine barkartennummer.

====
Das Problem: Das aller erste Mal läuft das alles rund und er macht bei gastkartebar:5 auch brav das 5te (genau genommen das 6te) Element rein.
Danach kann man aber eingeben, was man möchte, er macht dann immer das von vorher.
Wenn ich jetzt gastkartebar:47 eingebe, fügt er wieder das 5. ein. Und wieder und wieder. Er hat sich auf das allererste festgesetzt.
Nur nach nem Neustart des Programms kann ich wieder ein neues Element festlegen, worauf er sich festnagelt.

Mit System.out.println lasse ich mir die Nummer ausgeben, er sagt dann auch in der Konsole immer 5.


Wo hab ich jetzt was nicht durchdacht?

Schöner Gruß
Lukas
 
Ich finde in deiner Spielverlauf -Klasse nirgends die Deklaration von barkartennummer (und übrigens auch nicht von jLabelMeldung und einer Reihe anderer Variablen). Wo kommen sie her? Da du sie in einer statischen methode verwendest, ist sie offenbar auch statisch. Fragt sie nur, in welcher Klasse sie letztlich angelegt wurde.
Ausserdem sind die anderen Methoden in deiner Spielverlauf-Klasse statisch. Nach OO sieht das nicht aus.
Alles in allem zu wenig Informationen für eine genauere Analyse.
 
Hallo,

sorry, sorry, ich hab so viel geschrieben, irgendetwas habe ich vergessen.
Ich wollte noch sagen, dass das nur eine Nebenklasse namens "Spielverlauf" ist. Die Hauptklasse "CafeRoot" definiert die ganzen Variablen.
Java:
package spiel;

import java.awt.Container;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.IOException;
import java.util.*;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.WindowConstants;

/**
  * @version 1.5.5 Spielstart & Kartenmischen, Namensabfrage, Windoof-Veraltungsabfrage sowie Spielstandsabspeicherung und Neustartfunktion
  * Neuerungen:
  * 1.5.1: Auslagerung in Startmethoden "Spielstart" und effektivierer Reader eingebaut
  * 1.5.2: Hinzufügen einer jList für die Länderkarten
  * 1.5.3: Umfangreiche Neugenerierung der Länder-Tisch-Karten und Abbildung in einer jList
  * 1.5.4: Abspeichern der Länderkarten
  * 1.5.5: DOS-Befehlszeile eingeführt und Neustart- sowie Schließen-Methode ausgelagert
  * @author Lukas Schramm
  */

public class CafeRoot extends JFrame {
  
  //private Spielstart start; 

  protected static final long serialVersionUID = 2463407896592093246L;
  // Anfang Attribute
  protected static String spielname = "Café International";
  protected static String OS = System.getProperty("os.name").toLowerCase();
  protected static int spielangefangen = 0;
  protected static int restkartentisch = 0;
  protected static int restkartengast = 0;
  protected static int restbarplaetze = 0;
  protected static int handkartenspieler1 = 0;
  protected static int handkartenspieler2 = 0;
  protected static int punktespieler1 = 0;
  protected static int punktespieler2 = 0;
  protected static int spieler = 0;
  protected static String spielername1 = "Spieler 1";
  protected static String spielername2 = "Spieler 2";
  protected static List<Gastkarte> gastkarten = new ArrayList<Gastkarte>();
  protected static List<Laenderkarte> laenderkarten = new ArrayList<Laenderkarte>();
  protected static JList<Gastkarte> jListGastkarten = new JList<Gastkarte>();
  protected static DefaultListModel<Gastkarte> jListGastkartenModel = new DefaultListModel<Gastkarte>();
  protected static JScrollPane jListGastkartenScrollPane= new JScrollPane(jListGastkarten);
  protected static JLabel jLabelRestkartenTisch = new JLabel();
  protected static JLabel jLabelRestkartenGast = new JLabel();
  protected static JLabel jLabelRestbarplaetze = new JLabel();
  protected static JLabel jLabelHandkartenSpieler1 = new JLabel();
  protected static JLabel jLabelHandkartenSpieler2 = new JLabel();
  protected static JLabel jLabelPunkteSpieler1 = new JLabel();
  protected static JLabel jLabelPunkteSpieler2 = new JLabel();
  protected static JLabel jLabelSpieler = new JLabel();
  protected static JLabel jLabelMeldung = new JLabel();
  protected static boolean spielernamenkorrekt = false;
  protected static boolean neuesspielbutton = false;
  protected static JButton jButtonNeustart = new JButton();
  protected static JList<Laenderkarte> jListLaenderkarten = new JList<Laenderkarte>();
  protected static DefaultListModel<Laenderkarte> jListLaenderkartenModel = new DefaultListModel<Laenderkarte>();
  protected static JScrollPane jListLaenderkartenScrollPane = new JScrollPane(jListLaenderkarten);
  protected static JList<Gastkarte> jListBarkarten = new JList<Gastkarte>();
  protected static DefaultListModel<Gastkarte> jListBarkartenModel = new DefaultListModel<Gastkarte>();
  protected static JScrollPane jListBarkartenScrollPane= new JScrollPane(jListBarkarten);
  protected static JTextField jTextFieldDosEingabe = new JTextField();
  protected static String doseingabe = "";
  protected static boolean doseingabeerfolgt = false;
  protected static ArrayList<String> doseingabepart = new ArrayList<String>();
  protected static int barkartennummer = 0;
  protected static String information = "";
  // Ende Attribute
  
  public CafeRoot(String title) throws IOException {
    // Frame-Initialisierung
    super(title);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    //Properties neuesspiel = Spielstart.loadProperties("neuesspiel.txt");
    Properties spielstand = Spielstart.loadProperties("spielstand.txt");
    int frameWidth = 600;//506 
    int frameHeight = 600;//434
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    setResizable(false);
    Container cp = getContentPane();
    setTitle(spielname);
    setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    setLocationRelativeTo(null);
    cp.setLayout(null);
    
    // Anfang Komponenten
    Komponenten.komponenten(cp);
    //=============================
    String string_spielangefangen = spielstand.getProperty("spielangefangen", "0");
    int spielangefangen = Integer.parseInt(string_spielangefangen);
    if (Spielstart.isWindows()) {
        JOptionPane.showMessageDialog(null, "Dein System ist hoffnungslos veraltet!\nWindoof ist nicht kompatibel mit diesem Spiel.\nSollte es zu Problemen bei der Ausführung kommen,\ndann öffne das Spiel bitte auf einem PC\nmit Mac OS oder Linux!", "System veraltet", JOptionPane.WARNING_MESSAGE);
        System.out.println("Ein veraltetes System \"Windows\" wurde entdeckt");
        }
    if(spielangefangen == 0) {
    	do{
    		Spielstart.namensfrage();
    	}while(spielernamenkorrekt == false);
    	System.out.println("Spieler 1 heißt: "+spielername1);
        System.out.println("Spieler 2 heißt: "+spielername2);
        Spielstart.neuesspiel();
        Spielstart.gastkartenmischen();
        Spielstart.laenderkartenmischen();
    }
    else{
    	Spielstart.spielstand();
    }
    
    
    // Ende Komponenten
    
    setVisible(true);
    addWindowListener(new MyWindowListener(this, spielstand));
    //=============================
    
    Random wuerfel1 = new Random(); //Würfeltest
    int wuerfel = wuerfel1.nextInt(49)+1; //Würfeltest
    System.out.println(wuerfel);
  }
  
  // Anfang Methoden
  
  public static void jButtonNeustart_ActionPerformed(ActionEvent evt) throws IOException {
	  Spielstart.neustart();
  }
 
  // Ende Methoden
  
  public static void main(String[] args) throws IOException {
    new CafeRoot("CafeRoot");
  } // end of main 
  public class MyWindowListener implements WindowListener {
    private CafeRoot cRoot;
    
    public MyWindowListener(CafeRoot cRoot,Properties spielstand) {
      this.cRoot = cRoot;
    }
    
    @Override
    public void windowActivated(WindowEvent arg0) { }
    
    @Override
    public void windowClosed(WindowEvent arg0) {
      cRoot.setVisible(false);  
    }
    
    @Override
    public void windowClosing(WindowEvent evt) {
      try {
		Spielstart.beenden();
      } catch (IOException e) {
		e.printStackTrace();
      }
    }
    
    @Override
    public void windowDeactivated(WindowEvent arg0) { }
    @Override
    public void windowDeiconified(WindowEvent arg0) { }
    @Override
    public void windowIconified(WindowEvent arg0) { }
    @Override
    public void windowOpened(WindowEvent arg0) { }
    
    
  }
} // end of class CafeRoot

Das sind jetzt alle im ganzen Projekt. Die relevanten sollten zumeist ganz unten sein, weil sie die neuesten sind. 🙂

Gruß
Lukas 😉
 
Zuletzt bearbeitet von einem Moderator:
Huch, das ist mir jetzt peinlich, ich habe den Fehler. 😀

Etwas kollateral dummer Fehler. Ich hatte jetzt ohne groß nachzudenken gedacht, wenn ich da neuen Text eingebe, wird die ArrayList geleert und neu befüllt.
Wie beispielsweise das n bei ner For-Schleife:
Java:
for(int n=0;n<42;n++)

Aber okay,der ergänzt ja bei jeder Ausführung des Codes mit add nur weitere Elemente. Die ersten beiden bleiben ja immer, deshalb hat er immer den gleichen Text ausgeführt.

Das hier am Anfang schafft Abhilfe:
Java:
doseingabepart.clear();

Es wundert mich nur, warum meine Überprüfung hier, direkt danach den Fehler nicht abgefangen hat:
Java:
if (doseingabepart.size() > 3) {
			eingabeinkorrekt(5000);
		}
Weil schon beim zweiten mal, sind 2+2 schon größer als 3...
Naja, das find ich noch heraus.

Danke schön und einen schönen Abend noch!

Bussy
Lukas
 
Java:
if (doseingabepart.size() > 3) {
			eingabeinkorrekt(5000);
		}
Weil schon beim zweiten mal, sind 2+2 schon größer als 3...
Ich habe zwar noch nie mit Swing-Timern gearbeitet, aber so wie ich die Doku verstehe, liegt ihr Vorteil darin, dass sie während des Delays nicht den EDT blockieren und die Gui somit nicht einfriert. Die Aktionen, die sie in ihrer actionPerformed-Methode ausführen, laufen aber weiterhin auf dem EDT, wie überhaupt alle Actions, die Swing Komponenten verändern, auf dem EDT laufen müssen. Wenn du deine eingabekorrekt-Methode ebenfalls auf dem EDT ausführst, z. B. wenn sie vom ActionListener eines JButtons gestartet wird, sollten die Kommandos in der actionPerformed() des Timers erst aufgerufen werden, wenn der ActionListener des JButtons bzw. seine actionPerformed() fertig ist.
Dann sollte in etwa folgendes passieren:
- in der eingabekorrekt wird der text des JLabels auf deinen Hinweis geändert. Ein entsprechender Event wird in die EventQueue eingespeist.
- Der Timer läuft los und ändert nach 5 Sekunden den Text wieder auf "". Es wird wieder ein entsprechender Event kreiert.
- Die actionPerformed() die den ganzen Kram losgetreten hat, wird beendet. Die Events in der Queue werden abgearbeitet. Zunächst wird der JLabel-Text auf deinen Hinweis gesetzt und die Gui repaianted. Wenn die 5 s Wartezeit schon abgelaufen sind, wird allerdings sofort der Text wieder auf "" gesetzt. Ev. ist die EventQueue sogar so schlau, daß sie merkt, daß der 2. Event das Ergebnis des 1. aufhebt, und den 1. Event aus der Queue schmeisst.
Wie wärs wenn du einen modalen Dialog einblendest, der sich nach einer Wartezeit selber disposed? Oder eine Sprachausgabe😀?
 
[ot]
Habe diese Beiträge in einen eigenen Thread verschoben, da es nichts mehr mit dem ursprünglichen Problem des anderen Threads zu tun hatte!
Bitte achtet darauf pro Thread nur ein Problem zu behandeln!
[/ot]
 
Hallöle,

eine Frage dazu hätte ich dann doch nochmal:
Der Quellcode sucht sich nach dem Modell text1:text2:text3 in dem Switch Case Teil ja den Inhalt von Text1 heraus. In dem Fall ist das "gastkartebar".
Dann guckt er nach dem Doppelpunkt bei Element text2, welche Zahl da steht und verarbeitet das weiter.
Nun gibt es aber noch zwei Fehlermöglichkeiten:
text2 ist keine Zahl oder text2 ist gar nicht vorhanden.
Das heißt, wenn ich gastkartebar:gdgf eingebe, kommt eine Fehlermeldung und wenn ich gastkartebar: eingebe kommt auch eine. Weil ich ja das Element mit parseInt in einen Integer umwandeln möchte.

Ich habe nun versucht beides abzufangen. Das sieht nun so aus:
Java:
case "gastkartebar":
			information = doseingabepart.get(1);
			try{
				barkartennummer = Integer.parseInt(information);
			}
			catch(NumberFormatException e){
				eingabeinkorrekt(5000); return;
			}
			catch(IndexOutOfBoundsException f){
				eingabeinkorrekt(5000); return;
			}
			System.out.println(information);
			barkarten();
			break;

Aber der Stand der Dinge ist so, dass nur das erste Element seine spezifischen Fehler abfängt. Also wenn ich gastkartebar:dashieristkeinezahl schreibe, bricht er das wie gewollt ab. Aber der zweite Block arbeitet nicht.
ich bekomme weiterhin, wenn hinter dem Doppelpunkt steht eine IndexOutOfBoundsException.
Code:
Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
	at java.util.ArrayList.rangeCheck(ArrayList.java:653)
	at java.util.ArrayList.get(ArrayList.java:429)
	at spiel.Spielverlauf.doseingabefenster(Spielverlauf.java:37)
	at spiel.Spielverlauf.doseingabeverarbeitung(Spielverlauf.java:24)
	at spiel.Komponenten$2.actionPerformed(Komponenten.java:63)
	at javax.swing.JTextField.fireActionPerformed(JTextField.java:508)
	at javax.swing.JTextField.postActionEvent(JTextField.java:721)
	at javax.swing.JTextField$NotifyAction.actionPerformed(JTextField.java:836)
	at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1663)
	at javax.swing.JComponent.processKeyBinding(JComponent.java:2879)
	at javax.swing.JComponent.processKeyBindings(JComponent.java:2926)
	at javax.swing.JComponent.processKeyEvent(JComponent.java:2842)
	at java.awt.Component.processEvent(Component.java:6302)
	at java.awt.Container.processEvent(Container.java:2234)
	at java.awt.Component.dispatchEventImpl(Component.java:4881)
	at java.awt.Container.dispatchEventImpl(Container.java:2292)
	at java.awt.Component.dispatchEvent(Component.java:4703)
	at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1954)
	at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:806)
	at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:1074)
	at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:945)
	at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:771)
	at java.awt.Component.dispatchEventImpl(Component.java:4752)
	at java.awt.Container.dispatchEventImpl(Container.java:2292)
	at java.awt.Window.dispatchEventImpl(Window.java:2739)
	at java.awt.Component.dispatchEvent(Component.java:4703)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:746)
	at java.awt.EventQueue.access$400(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:697)
	at java.awt.EventQueue$3.run(EventQueue.java:691)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
	at java.awt.EventQueue$4.run(EventQueue.java:719)
	at java.awt.EventQueue$4.run(EventQueue.java:717)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:716)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Kann mir jemand erklären, wieso das so ist?

Der aktuelle Quellcode ist:
Java:
package spiel;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.util.Arrays;

import javax.swing.Timer;

public class Spielverlauf extends CafeRoot{
	private static final long serialVersionUID = 7888790160235600024L;

	public Spielverlauf() throws IOException{
		super(spielname);
	}
	
	public static void doseingabeverarbeitung() throws IOException, InterruptedException {
		doseingabe = jTextFieldDosEingabe.getText();
		doseingabepart.clear();
		doseingabepart.addAll(Arrays.asList(doseingabe.split(":")));
		if (doseingabepart.size() > 3) {
			eingabeinkorrekt(5000); return;
		}
		doseingabefenster();
	}
	
	public static void doseingabefenster() throws IOException, InterruptedException {
		doseingabeerfolgt = true;
		switch(doseingabepart.get(0).toLowerCase()) {
		case "neustart":
			Spielstart.neustart();
			break;
		case "beenden":
			Spielstart.beenden();
			break;
		case "gastkartebar":
			information = doseingabepart.get(1);
			try{
				barkartennummer = Integer.parseInt(information);
			}
			catch(NumberFormatException e){
				eingabeinkorrekt(5000); return;
			}
			catch(IndexOutOfBoundsException f){
				eingabeinkorrekt(5000); return;
			}
			System.out.println(information);
			barkarten();
			break;
		default: doseingabeerfolgt = false;
		}
		if(doseingabeerfolgt == true) {
			jTextFieldDosEingabe.setText("");
			doseingabeerfolgt = false;
			jLabelMeldung.setText("");
		} else {
		eingabeinkorrekt(5000); return;
		}
	}
	
	public static void eingabeinkorrekt(int timerzeit) {
		jLabelMeldung.setText("Deine Eingabe war inkorrekt!");
		new Timer(timerzeit, new ActionListener() {
		public void actionPerformed(ActionEvent e) {
		jLabelMeldung.setText("");
		} } ).start();
	}
	
	public static void barkarten() {
		restbarplaetze -= 1;
		jLabelRestbarplaetze.setText("Barplätze übrig: "+restbarplaetze);
		jListBarkartenModel.addElement(gastkarten.get(barkartennummer));
		System.out.println(barkartennummer);
		System.out.println(gastkarten.get(barkartennummer));
	}

}

Schöne Grüße
Lukas
 
Die split-Methode von Strinsg erlaubt es, zusätzlich zu dem zeichen an dem gesplittet werden sol, einen int Parameter einzugeben, mit dem die Größe des zurückgelieferten Arrays begrenzt werden kann. Nur wenn ein Wert < 0 verwendet wird, wird auch an aufeinanderfolgenden Trennzeichen oder bei Trennzeichen zu Beginn und am Ende des Strings getrennt, und im Ergebnisarray stehen dann Leerstrings.
In deinem Fall würde dier Exception unterbleiben, wenn du den String "gastkartebar:" mit doseingabe.split(":", -1) splittest. Bei Eingabe von "gasthartebar" würde auch das nichts helfen. Daher würde ich vorschlagen, dass du in deiner doseingabefenster-Methode die Zeile information = doseingabepart.get(1); in den try-Block schreibst.
 
Hallöle,

die Variante mit der -1 funktioniert bei mir nicht, wie es soll. Der filtert dann ALLES raus, egal wie ich es eingebe.
Aber ansonsten hat es geholfen das mit in den Try Block zu schreiben.
Und da die Funktionen leider immer weiter führen und in weitere Methoden führen, muss ich das dann dort auch immer hinschreiben, traurige Sache... 🙁

Achso und ich musste noch das hier einbauen:
[Java]if(!(barkartennummer > 99 || barkartennummer < 1)) {[/code]
Gibt ja nur 100 Gastkarten. Sonst macht Java auch Problemchen...

Danke schön!

Gruß
Lukas 🙂
 
Huch, ähm, doch nicht. Es ist eine Farce. Ich arbeite zuhause mit Mac und Linux und in der Schule mit Windoof. Immer wenn ich es irgendwo hinbekommen habe, macht er es am entgegengesetzten Ort anders. Also vorhin hat es noch geklappt.


Mein aktueller Quelltext ist jetzt dieser:
Java:
package spiel;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.util.*;
import javax.swing.Timer;

public class DosEingabe extends CafeRoot{
	private static final long serialVersionUID = -4405571455280382266L;

	public DosEingabe() throws IOException{
		super(spielname);
	}
	
	public static void doseingabeverarbeitung() throws IOException, InterruptedException {
		doseingabe = jTextFieldDosEingabe.getText();
		doseingabepart.clear();
		doseingabepart.addAll(Arrays.asList(doseingabe.split(":")));
		if (doseingabepart.size() > 3) {
			eingabeinkorrekt(5000); return;
		}
		doseingabefenster();
	}
	
	public static void doseingabefenster() throws IOException, InterruptedException {
		doseingabeerfolgt = true;
		switch(doseingabepart.get(0).toLowerCase()) {
		case "neustart":
			Spielstart.neustart();
			break;
		case "beenden":
			Spielstart.beenden();
			break;
		case "gastkartebar":
			try{
				information = doseingabepart.get(1);
				barkartennummer = Integer.parseInt(information);
			}
			catch(NumberFormatException e){
				e.printStackTrace();
				eingabeinkorrekt(5000); return;
			}
			catch(IndexOutOfBoundsException f){
				f.printStackTrace();
				eingabeinkorrekt(5000); return;
			}
			if(!(barkartennummer > 5 || barkartennummer < 1)) {
				Punkte.barkarten();
			}else{
				eingabeinkorrekt(5000); return;
			}
			break;
			//Wichtige Anmerkung: Er fügt lediglich die Elementnummer von 0 bis 99 hinzu.
			//In Zukunft müssten dies jedoch die Karten 0 bis 4 des Spielers sein!
		default: doseingabeerfolgt = false;
		}
		if(doseingabeerfolgt == true) {
			jTextFieldDosEingabe.setText("");
			doseingabeerfolgt = false;
			jLabelMeldung.setText("");
		} else {
		eingabeinkorrekt(5000); return;
		}
	}
	
	public static void eingabeinkorrekt(int timerzeit) {
		jLabelMeldung.setText("Deine Eingabe war inkorrekt!");
		new Timer(timerzeit, new ActionListener() {
		public void actionPerformed(ActionEvent e) {
		jLabelMeldung.setText("");
		} } ).start();
	}

}

Das Format, was einzugeben ist, ist
Soll eine Nummer von 1 bis 5 sein. (war mal 1 bis 100)

Die vier Fehlerquellen sind nun:
a) Die Zahl ist nicht im Bereich 1 bis 5
b) Die Zahl ist kein int, sondern ne Kommazahl
c) da steht ein String und keine Zahl
d) da steht gar nichts.

Nur fall a ist bisher abgefangen.
Wieder erwarten, hat Java das hier tatsächlich begriffen:
Java:
if(!(barkartennummer > 5 || barkartennummer < 1)) {
				Punkte.barkarten();
			}else{
				eingabeinkorrekt(5000); return;
			}

Aber die Fälle B bis D, eine Farce...

Mal so als Beispiele:
B) Wenn ich da "gastkartebar:5,5" schreibe, kommt dieser Fehler:
Code:
java.lang.NumberFormatException: For input string: "5,5"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:580)
	at java.lang.Integer.parseInt(Integer.java:615)
	at spiel.DosEingabe.doseingabefenster(DosEingabe.java:38)
	at spiel.DosEingabe.doseingabeverarbeitung(DosEingabe.java:23)
	at spiel.Komponenten$2.actionPerformed(Komponenten.java:63)
	at javax.swing.JTextField.fireActionPerformed(JTextField.java:508)
	at javax.swing.JTextField.postActionEvent(JTextField.java:721)
	at javax.swing.JTextField$NotifyAction.actionPerformed(JTextField.java:836)
	at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1663)
	at javax.swing.JComponent.processKeyBinding(JComponent.java:2879)
	at javax.swing.JComponent.processKeyBindings(JComponent.java:2926)
	at javax.swing.JComponent.processKeyEvent(JComponent.java:2842)
	at java.awt.Component.processEvent(Component.java:6302)
	at java.awt.Container.processEvent(Container.java:2234)
	at java.awt.Component.dispatchEventImpl(Component.java:4881)
	at java.awt.Container.dispatchEventImpl(Container.java:2292)
	at java.awt.Component.dispatchEvent(Component.java:4703)
	at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1954)
	at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:806)
	at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:1074)
	at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:945)
	at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:771)
	at java.awt.Component.dispatchEventImpl(Component.java:4752)
	at java.awt.Container.dispatchEventImpl(Container.java:2292)
	at java.awt.Window.dispatchEventImpl(Window.java:2739)
	at java.awt.Component.dispatchEvent(Component.java:4703)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:746)
	at java.awt.EventQueue.access$400(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:697)
	at java.awt.EventQueue$3.run(EventQueue.java:691)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
	at java.awt.EventQueue$4.run(EventQueue.java:719)
	at java.awt.EventQueue$4.run(EventQueue.java:717)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:716)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

C) Wenn ich da zum Beispiel nen String angebe "gastkartebar:xyz", dann kommt das hier:
Code:
java.lang.NumberFormatException: For input string: "xyz"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:580)
	at java.lang.Integer.parseInt(Integer.java:615)
	at spiel.DosEingabe.doseingabefenster(DosEingabe.java:38)
	at spiel.DosEingabe.doseingabeverarbeitung(DosEingabe.java:23)
	at spiel.Komponenten$2.actionPerformed(Komponenten.java:63)
	at javax.swing.JTextField.fireActionPerformed(JTextField.java:508)
	at javax.swing.JTextField.postActionEvent(JTextField.java:721)
	at javax.swing.JTextField$NotifyAction.actionPerformed(JTextField.java:836)
	at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1663)
	at javax.swing.JComponent.processKeyBinding(JComponent.java:2879)
	at javax.swing.JComponent.processKeyBindings(JComponent.java:2926)
	at javax.swing.JComponent.processKeyEvent(JComponent.java:2842)
	at java.awt.Component.processEvent(Component.java:6302)
	at java.awt.Container.processEvent(Container.java:2234)
	at java.awt.Component.dispatchEventImpl(Component.java:4881)
	at java.awt.Container.dispatchEventImpl(Container.java:2292)
	at java.awt.Component.dispatchEvent(Component.java:4703)
	at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1954)
	at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:806)
	at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:1074)
	at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:945)
	at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:771)
	at java.awt.Component.dispatchEventImpl(Component.java:4752)
	at java.awt.Container.dispatchEventImpl(Container.java:2292)
	at java.awt.Window.dispatchEventImpl(Window.java:2739)
	at java.awt.Component.dispatchEvent(Component.java:4703)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:746)
	at java.awt.EventQueue.access$400(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:697)
	at java.awt.EventQueue$3.run(EventQueue.java:691)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
	at java.awt.EventQueue$4.run(EventQueue.java:719)
	at java.awt.EventQueue$4.run(EventQueue.java:717)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:716)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

D) Und letztes Beispiel, wenn da gar nichts hinter steht: "gastkartebar:" oder "gastkartebar"
Code:
java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
	at java.util.ArrayList.rangeCheck(ArrayList.java:653)
	at java.util.ArrayList.get(ArrayList.java:429)
	at spiel.DosEingabe.doseingabefenster(DosEingabe.java:37)
	at spiel.DosEingabe.doseingabeverarbeitung(DosEingabe.java:23)
	at spiel.Komponenten$2.actionPerformed(Komponenten.java:63)
	at javax.swing.JTextField.fireActionPerformed(JTextField.java:508)
	at javax.swing.JTextField.postActionEvent(JTextField.java:721)
	at javax.swing.JTextField$NotifyAction.actionPerformed(JTextField.java:836)
	at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1663)
	at javax.swing.JComponent.processKeyBinding(JComponent.java:2879)
	at javax.swing.JComponent.processKeyBindings(JComponent.java:2926)
	at javax.swing.JComponent.processKeyEvent(JComponent.java:2842)
	at java.awt.Component.processEvent(Component.java:6302)
	at java.awt.Container.processEvent(Container.java:2234)
	at java.awt.Component.dispatchEventImpl(Component.java:4881)
	at java.awt.Container.dispatchEventImpl(Container.java:2292)
	at java.awt.Component.dispatchEvent(Component.java:4703)
	at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1954)
	at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:806)
	at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:1074)
	at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:945)
	at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:771)
	at java.awt.Component.dispatchEventImpl(Component.java:4752)
	at java.awt.Container.dispatchEventImpl(Container.java:2292)
	at java.awt.Window.dispatchEventImpl(Window.java:2739)
	at java.awt.Component.dispatchEvent(Component.java:4703)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:746)
	at java.awt.EventQueue.access$400(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:697)
	at java.awt.EventQueue$3.run(EventQueue.java:691)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
	at java.awt.EventQueue$4.run(EventQueue.java:719)
	at java.awt.EventQueue$4.run(EventQueue.java:717)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:716)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Und ich verstehe das jetzt wirklich nicht. Wieso zeigt er denn immer noch "IndexOutOfBoundsException" oder "NumberFormatException" an, obwohl das da im try-catch steht?

Gruß
Lukas 🙂
 
Moin,

mal kurz zur IOOB-Exception:
Dir wird angezeigt: Index: 1, Size: 1

Die Länge eines Arrays wird immer von '0' bis 'Länge - 1 ' referenziert!!

Also ist bei Länge '1' nur Index '0' zugreifbar und alles andere führt zur Exception!

Gruß
Klaus
 
Oh Mann....
Natürlich "kommt der Fehler". Das Abfangen von Exceptions bedeutet ja nicht, daß die Exceptions danach nicht mehr auftreten, sondern daß sie korrekt behandelt werden und keinen unkontrollierten Schaden anrichten können.
Du hast es doch selber so programmiert, daß die stack traces ausgegeben werden!
Oder ev. ja nicht, sondern jemand hat dir den Code gegeben und du verstehst ihn nicht :bahnhof:
 

Zurück
Oben