# EventDispatchThread



## tanscha (29. Jul 2009)

Hallöchen!

Ich bin absolute Anfängerin in Java und blicke hier gerade voll nicht durch. Es handelt sich um eine eigene Skriptsprache, welche ich versuche zu definieren. Es ist nichts brauchbares, es soll nur zu Übungszwecken dienen. Wenn ich allerdings das Programm laufen lasse, kommt bei mir ein EventDispatchThread zum Vorschein. Ich kapier den gerade nicht und weiss nicht, was nicht stimmt...:bahnhof:
Hier mein Code:


```
package ch.raiffeisenCOPY;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Calendar;
import java.util.GregorianCalendar;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

import com.sun.java_cup.internal.internal_error;

public class EigeneSkriptsprache extends JFrame implements ActionListener {

	private BorderLayout layout;
	private JButton btn;
	private JTextArea txtarea;
	private JScrollPane scrollArea;

	public EigeneSkriptsprache() {
		super("Neue Programmiersprache");

		this.setSize(600, 400);
		this.setResizable(true);
		this.setVisible(true);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);

		layout = new BorderLayout();
		btn = new JButton("Start");
		txtarea = new JTextArea(
				"#email [email]tanja@bluemail.com[/email]\n#alert Hallo\n#clock\n#sum 5 6 9\n" +
				"#midpoint 4 50\n#capital raiffeisen\n#lowercase MÖNGI\n#squared 7\n" +
				"#product 3 4 2\n#subtraction 15 4\n#division 8 4\n#close");
		scrollArea = new JScrollPane(txtarea);

		txtarea.setLineWrap(false);
		txtarea.setTabSize(2);

		btn.addActionListener(this);

		this.getContentPane().setLayout(layout);
		this.getContentPane().add(scrollArea, BorderLayout.CENTER);
		this.getContentPane().add(btn, BorderLayout.SOUTH);
	}
	
	
	
 /**
  * Meine Dokumentation.
  */
	public void actionPerformed(ActionEvent event) {
		Object obj = event.getSource();
		
		if(obj.equals(btn)) {
			final String SIGN = "#";
			final String MY_LANGUAGE_ALERT = "alert";
			final String MY_LANGUAGE_CLOCK = "clock";
			final String MY_LANGUAGE_CLOSE = "close";
			final String MY_LANGUAGE_SUM = "sum";
			final String MY_LANGUAGE_EMAIL = "email";
			final String MY_LANGUAGE_MITTELWERT = "midpoint";
			final String MY_LANGUAGE_CAPITAL = "capital";
			final String MY_LANGUAGE_LOWERCASE = "lowercase";
			final String MY_LANGUAGE_SQUARED = "squared";
			final String MY_LANGUAGE_PRODUCT = "product";
			final String MY_LANGUAGE_DIVISION = "division";
			final String MY_LANGUAGE_SUBTRACTION = "subtraction";
			
			Calendar cal = new GregorianCalendar();
			String time = cal.get(Calendar.HOUR_OF_DAY) + ":" + cal.get(Calendar.MINUTE);
			
			String scriptEingabe = txtarea.getText();
			
			String[] alleCodes = scriptEingabe.split(SIGN); // split(#) macht nach jedem
																											// # ein neues item und
																											// füllt es in ein Array
																											// ab.
			
			for(int i=0; i < alleCodes.length; i++) {
				String temp = alleCodes[i].trim().replace("'", "");
				if(temp.length() > 0) {
					if(temp.startsWith(MY_LANGUAGE_ALERT)) {
						JOptionPane.showMessageDialog(this, temp.substring(MY_LANGUAGE_ALERT.length(), temp.length())); //substring() bewirkt folgendes: "hamburger".substring(4, 8) returns "urge"

					}
					else if(temp.startsWith(MY_LANGUAGE_CLOCK)) {
						JOptionPane.showMessageDialog(this, time);
					}
					else if(temp.startsWith(MY_LANGUAGE_CAPITAL)) {
						JOptionPane.showMessageDialog(this, temp.substring(MY_LANGUAGE_CAPITAL.length(), temp.length()).toUpperCase());
					}
					else if(temp.startsWith(MY_LANGUAGE_LOWERCASE)) {
						JOptionPane.showMessageDialog(this, temp.substring(MY_LANGUAGE_LOWERCASE.length(), temp.length()).toLowerCase());
					}			
					else if(temp.startsWith(MY_LANGUAGE_SQUARED)) {
						temp = temp.substring(MY_LANGUAGE_SQUARED.length(), temp.length()).trim();
						String[] zahlen = temp.split(" ");
						int total = 0;
						for(int x=0; x < zahlen.length; x++) {
							total = Integer.parseInt(zahlen[x])*Integer.parseInt(zahlen[x]);
						}
						JOptionPane.showMessageDialog(this, "Resultat " + String.valueOf(total));
					}
					else if(temp.startsWith(MY_LANGUAGE_CLOSE)) {
						System.exit(0);
					}
					else if(temp.startsWith(MY_LANGUAGE_SUM)) {
						temp = temp.substring(MY_LANGUAGE_SUM.length(), temp.length()).trim();
						String[] zahlen = temp.split(" ");
						int total = 0;
						for(int j=0; j < zahlen.length; j++) {
							total += Integer.parseInt(zahlen[j]);
						}
						JOptionPane.showMessageDialog(this, "Resultat " + String.valueOf(total));
					}
					else if(temp.startsWith(MY_LANGUAGE_SUBTRACTION)) {
						temp = temp.substring(MY_LANGUAGE_SUBTRACTION.length(), temp.length()).trim();
						String[] zahlen = temp.split(" ");
						int total = 0;
						for(int j=0; j < zahlen.length; j++) {
							total -= Integer.parseInt(zahlen[j]);
						}
						JOptionPane.showMessageDialog(this, "Resultat " + String.valueOf(total));
					}
						}
						else {
							int[] zahlen = new int[2];
							zahlen[0] = Integer.parseInt(scriptEingabe);
							zahlen[1] = Integer.parseInt(scriptEingabe);
							int total = zahlen[0]/zahlen[1];
							JOptionPane.showMessageDialog(this, "Resultat " + String.valueOf(total));
						}
					}
					else if(temp.startsWith(MY_LANGUAGE_PRODUCT)) {
						temp = temp.substring(MY_LANGUAGE_PRODUCT.length(), temp.length()).trim();
						String[] zahlen = temp.split(" ");
						int total = 1;
						for(int y=0; y < zahlen.length; y++) {
							total *= Integer.parseInt(zahlen[y]);
						}
						JOptionPane.showMessageDialog(this, "Resultat " + String.valueOf(total));
					}
					else if(temp.startsWith(MY_LANGUAGE_MITTELWERT)) {
						temp = temp.substring(MY_LANGUAGE_MITTELWERT.length(), temp.length()).trim();
						String[] zahlen = temp.split(" ");
						int total = 0;
						for(int k=0; k < zahlen.length; k++) {
							total += (Integer.parseInt(zahlen[k]))/zahlen.length;
						}
						JOptionPane.showMessageDialog(this, "Resultat " + String.valueOf(total));
					}
					else if(temp.startsWith(MY_LANGUAGE_EMAIL)) {
						temp = temp.substring(MY_LANGUAGE_EMAIL.length(), temp.length()).trim();
						if(temp.indexOf("@") > 0) { // indexOf überprüft, ob "@" an der
																				// Stelle >0 ist (also 1. 2. 3. etc.)
							JOptionPane.showMessageDialog(this, "Korrektes EMail");
							// TODO Send Test- Mail
						}
						else {
							JOptionPane.showMessageDialog(this, "Falsches EMail", "@ Kontrolle", JOptionPane.WARNING_MESSAGE);
						}
					}
				}
			}
		}

	public static void main(String[] args) {
		EigeneSkriptsprache scriptFrame = new EigeneSkriptsprache();
		scriptFrame.setLocation(300, 300);
		scriptFrame.setVisible(true);
	}
}
```

Kann mir jemand sagen, wo das Problem liegt?


----------



## 0001001 (29. Jul 2009)

Poste doch mal die Fehlermeldung.


----------



## tanscha (29. Jul 2009)

Es kommt eben keine Fehlermeldung, sondern ein EventDispachThread:


```
/*
 * @(#)src/classes/sov/java/awt/EventDispatchThread.java, awt, as142, 20040916atmp 1.18.2.1
 * ===========================================================================
 * Licensed Materials - Property of IBM
 * "Restricted Materials of IBM"
 *
 * IBM SDK, Java(tm) 2 Technology Edition, v1.4.2
 * (C) Copyright IBM Corp. 2003, 2004. All Rights Reserved
 * ===========================================================================
 */

/*
 * ===========================================================================
 * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
 * ===========================================================================
 */
/* 
 *
 * Change activity:
 *
 * Reason  Date   Origin    Description
 * ------  ----   ------    -------------------------------------------------- 
 * 63757   050903 slattery  Add IBM module header; 
 * 57103   101202 seand     Prevent event filtering during modal dialog on 
 *                          4690 platform.
 * 63757   151003 jury      Merge 142
 *
 * Not Included
 * 51501   290502 slattery  Fix for modal dialog bug 
 *
 * ===========================================================================
 * Module Information:
 * 
 * DESCRIPTION: IBM.WRITEME
 * ===========================================================================
 */

/*
 * @(#)EventDispatchThread.java	1.46 03/01/23
 *
 */

package java.awt;

import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import java.awt.event.ActionEvent;
import java.lang.reflect.Method;
import java.security.AccessController;
import sun.security.action.GetPropertyAction;
import sun.awt.DebugHelper;
import sun.awt.AWTAutoShutdown;
import sun.awt.SunToolkit;

import sun.awt.dnd.SunDragSourceContextPeer;

/**
 * EventDispatchThread is a package-private AWT class which takes
 * events off the EventQueue and dispatches them to the appropriate
 * AWT components.
 *
 * The Thread starts a "permanent" event pump with a call to
 * pumpEvents(Conditional) in its run() method. Event handlers can choose to
 * block this event pump at any time, but should start a new pump (<b>not</b>
 * a new EventDispatchThread) by again calling pumpEvents(Conditional). This
 * secondary event pump will exit automatically as soon as the Condtional
 * evaluate()s to false and an additional Event is pumped and dispatched.
 *
 * @author Tom Ball
 * @author Amy Fowler
 * @author Fred Ecks
 * @author David Mendenhall
 * 
 * @version 1.46, 01/23/03
 * @since 1.1
 */
class EventDispatchThread extends Thread {
    private static final DebugHelper dbg = DebugHelper.create(EventDispatchThread.class);
    private static final boolean FILTER_MODAL_INPUT = System.getProperty("os.name","").indexOf("4690") == -1; //ibm.57103

    private EventQueue theQueue;
    private boolean doDispatch = true;
    private static final int ANY_EVENT = -1;

    EventDispatchThread(ThreadGroup group, String name, EventQueue queue) {
        super(group, name);
        theQueue = queue;
    }

    void stopDispatchingImpl(boolean wait) {
	// Note: We stop dispatching via a flag rather than using
	// Thread.interrupt() because we can't guarantee that the wait()
	// we interrupt will be EventQueue.getNextEvent()'s.  -fredx 8-11-98

        doDispatch = false;

	// wait for the dispatcher to complete
	if (Thread.currentThread() != this) {

            // fix 4122683, 4128923
            // Post an empty event to ensure getNextEvent is unblocked
            //
            // We have to use postEventPrivate instead of postEvent because
            // EventQueue.pop calls EventDispatchThread.stopDispatching.
            // Calling SunToolkit.flushPendingEvents in this case could
            // lead to deadlock.
            theQueue.postEventPrivate(new EmptyEvent());
                
            if (wait) {
                try {
                    join();
                } catch(InterruptedException e) {
                }
            }
	}
    }

    public void stopDispatching() {
        stopDispatchingImpl(true);
    }

    public void stopDispatchingLater() {
        stopDispatchingImpl(false);
    }

    class EmptyEvent extends AWTEvent implements ActiveEvent {
	public EmptyEvent() {
	    super(EventDispatchThread.this,0);
	}

	public void dispatch() {}
    }

    public void run() {
	try {
	    pumpEvents(new Conditional() {
		public boolean evaluate() {
		    return true;
		}
	    });	    
	} finally {
	    /*
	     * This synchronized block is to secure that the event dispatch 
	     * thread won't die in the middle of posting a new event to the
	     * associated event queue. It is important because we notify
	     * that the event dispatch thread is busy after posting a new event
	     * to its queue, so the EventQueue.dispatchThread reference must
	     * be valid at that point.
	     */
	    synchronized (theQueue) {
		theQueue.detachDispatchThread();
                /*
                 * Event dispatch thread dies in case of an uncaught exception. 
                 * A new event dispatch thread for this queue will be started
                 * only if a new event is posted to it. In case if no more
                 * events are posted after this thread died all events that 
                 * currently are in the queue will never be dispatched.
                 */
                /*
                 * Fix for 4648733. Check both the associated java event
                 * queue and the PostEventQueue.
                 */
                if (theQueue.peekEvent() != null || 
                    !SunToolkit.isPostEventQueueEmpty()) { 
                    theQueue.initDispatchThread();
                }
		AWTAutoShutdown.getInstance().notifyThreadFree(this);
	    }
	}
    }

    void pumpEvents(Conditional cond) {
	pumpEvents(ANY_EVENT, cond);
    }

    void pumpEventsForHierarchy(Conditional cond, Component modalComponent) {
        pumpEventsForHierarchy(ANY_EVENT, cond, modalComponent);
    }

    void pumpEvents(int id, Conditional cond) {
        pumpEventsForHierarchy(id, cond, null);
    }

    void pumpEventsForHierarchy(int id, Conditional cond, Component modalComponent)
    {
        while (doDispatch && cond.evaluate()) {
            if (isInterrupted() || !pumpOneEventForHierarchy(id, modalComponent)) {
                doDispatch = false;
            }
        }
    }

    boolean pumpOneEventForHierarchy(int id, Component modalComponent) {
        try {
            AWTEvent event;
            boolean eventOK;
            do {
	        event = (id == ANY_EVENT)
		    ? theQueue.getNextEvent()
		    : theQueue.getNextEvent(id);

                eventOK = true;
                if ((modalComponent != null) && FILTER_MODAL_INPUT) { //ibm.57103
                    /*
                     * filter out MouseEvent and ActionEvent that's outside
                     * the modalComponent hierarchy.
                     * KeyEvent is handled by using enqueueKeyEvent
                     * in Dialog.show
                     */
                    int eventID = event.getID();
                    if ((eventID >= MouseEvent.MOUSE_FIRST &&
                         eventID <= MouseEvent.MOUSE_LAST)      ||
                        (eventID >= ActionEvent.ACTION_FIRST &&
                         eventID <= ActionEvent.ACTION_LAST)) {
                        Object o = event.getSource();
                        if (o instanceof Component) {
                            Component c = (Component) o;
                            if (modalComponent instanceof Container) {
                                while (c != modalComponent && c != null) {
                                    c = c.getParent();
                                }
                            }
                            if (c != modalComponent) {
                                eventOK = false;
                            }
                        }
                    }
                }
                eventOK = eventOK && SunDragSourceContextPeer.checkEvent(event);
                if (!eventOK) {
                    event.consume();
                }
            } while (eventOK == false);
                      
	    if ( dbg.on ) dbg.println("Dispatching: "+event);

            theQueue.dispatchEvent(event);
            return true;
        } catch (ThreadDeath death) {
            return false;

        } catch (InterruptedException interruptedException) {
            return false; // AppContext.dispose() interrupts all
                          // Threads in the AppContext

	    // Can get and throw only unchecked exceptions
        } catch (RuntimeException e) {
            processException(e, modalComponent != null);
        } catch (Error e) {
            processException(e, modalComponent != null);
        }
        return true;
    }

    private void processException(Throwable e, boolean isModal) {
        if (!handleException(e)) {
            // See bug ID 4499199.
            // If we are in a modal dialog, we cannot throw
            // an exception for the ThreadGroup to handle (as added
            // in RFE 4063022).  If we did, the message pump of
            // the modal dialog would be interrupted.
            // We instead choose to handle the exception ourselves.
            // It may be useful to add either a runtime flag or API
            // later if someone would like to instead dispose the
            // dialog and allow the thread group to handle it.
            if (isModal) {
                System.err.println(
                    "Exception occurred during event dispatching:");
                e.printStackTrace();
            } else if (e instanceof RuntimeException) {
                throw (RuntimeException)e;
            } else if (e instanceof Error) {
                throw (Error)e;
            }
        }
    }

    private static final String handlerPropName = "sun.awt.exception.handler";
    private static String handlerClassName = null;
    private static String NO_HANDLER = new String();

    /**
     * Handles an exception thrown in the event-dispatch thread.
     *
     * <p> If the system property "sun.awt.exception.handler" is defined, then
     * when this method is invoked it will attempt to do the following:
     *
     * <ol>
     * <li> Load the class named by the value of that property, using the
     *      current thread's context class loader,
     * <li> Instantiate that class using its zero-argument constructor,
     * <li> Find the resulting handler object's <tt>public void handle</tt>
     *      method, which should take a single argument of type
     *      <tt>Throwable</tt>, and
     * <li> Invoke the handler's <tt>handle</tt> method, passing it the
     *      <tt>thrown</tt> argument that was passed to this method.
     * </ol>
     *
     * If any of the first three steps fail then this method will return
     * <tt>false</tt> and all following invocations of this method will return
     * <tt>false</tt> immediately.  An exception thrown by the handler object's
     * <tt>handle</tt> will be caught, and will cause this method to return
     * <tt>false</tt>.  If the handler's <tt>handle</tt> method is successfully
     * invoked, then this method will return <tt>true</tt>.  This method will
     * never throw any sort of exception.
     *
     * <p> <i>Note:</i> This method is a temporary hack to work around the
     * absence of a real API that provides the ability to replace the
     * event-dispatch thread.  The magic "sun.awt.exception.handler" property
     * <i>will be removed</i> in a future release.
     *
     * @param  thrown  The Throwable that was thrown in the event-dispatch
     *                 thread
     *
     * @return  <tt>false</tt> if any of the above steps failed, otherwise
     *          <tt>true</tt>
     */
    private boolean handleException(Throwable thrown) {

        try {

            if (handlerClassName == NO_HANDLER) {
                return false;   /* Already tried, and failed */
            }

            /* Look up the class name */
            if (handlerClassName == null) {
                handlerClassName = ((String) AccessController.doPrivileged(
                    new GetPropertyAction(handlerPropName)));
                if (handlerClassName == null) {
                    handlerClassName = NO_HANDLER; /* Do not try this again */
                    return false;
                }
            }

            /* Load the class, instantiate it, and find its handle method */
            Method m;
            Object h;
            try {
                ClassLoader cl = Thread.currentThread().getContextClassLoader();
                Class c = Class.forName(handlerClassName, true, cl);
                m = c.getMethod("handle", new Class[] { Throwable.class });
                h = c.newInstance();
            } catch (Throwable x) {
                handlerClassName = NO_HANDLER; /* Do not try this again */
                return false;
            }

            /* Finally, invoke the handler */
            m.invoke(h, new Object[] { thrown });

        } catch (Throwable x) {
            return false;
        }

        return true;
    }

    boolean isDispatching(EventQueue eq) {
	return theQueue.equals(eq);
    }

    EventQueue getEventQueue() { return theQueue; }
}
```

Es erscheint diese Klasse, aber auf der Konsole und im Code selber sind keine Fehler angezeigt. Was heisst das????:L


----------



## tfa (29. Jul 2009)

Du lässt das Programm nicht zufällig in Eclipse laufen? Ich nehme an, eine unbehandelte Exception im EDT tritt auf und Eclipse hält den Thread automatisch an. Klicke im Debug-View auf Resume (F8) und schau dir die Konsole an. Da sollte dann eine Fehlermeldung stehen.


----------



## tanscha (29. Jul 2009)

tfa hat gesagt.:


> Du lässt das Programm nicht zufällig in Eclipse laufen?
> ...
> Klicke im Debug-View auf Resume (F8) und schau dir die Konsole an. Da sollte dann eine Fehlermeldung stehen.



Doch, ich arbeite mit Eclipse. Wenn ich in der Debug-View auf F8 drücke, geschieht nichts. Die Konsole zeigt nichts an... Sorry, echt blöd zum beschreiben... :-(


----------



## tanscha (29. Jul 2009)

tfa hat gesagt.:


> ...
> Da sollte dann eine Fehlermeldung stehen.



Jetzt ist doch was aufgetaucht, versteh's aber trotzdem nicht:


```
Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "#email [email]tanja@bluemail.com[/email]
#alert Hallo
#clock
#sum 5 6 9
#midpoint 4 50
#capital raiffeisen
#lowercase MÖNGI
#squared 7
#product 3 4 2
#subtraction 15 4
#division 8 4
#close"
	at java.lang.NumberFormatException.forInputString(Unknown Source)
	at java.lang.Integer.parseInt(Unknown Source)
	at java.lang.Integer.parseInt(Unknown Source)
	at ch.raiffeisenCOPY.EigeneSkriptsprache.actionPerformed(EigeneSkriptsprache.java:139)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
```


----------



## MiDniGG (29. Jul 2009)

Hm. Kein Plan was in Deim Programm passiert. Aber auf jeden Fall grigst Du ne NumberFormatException. Sprich Du versuchst einen bspw. String in eine Zahl zu casten, obwohl dieser auch andere Zeichen als Ziffern enthält...


----------



## 0001001 (29. Jul 2009)

Du versuchst in Zeile 139 einen String, nämlich den Text:
"#email tanja@bluemail.com

auf einen Integerwert zu casten.
Das kann nicht funktionieren.


----------

