Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > de.comp.lang.java > #13022

Re: JUnit Test von JButton: Action wird nicht erkannt

From Patrick Roemer <sangamon@netcologne.de>
Newsgroups de.comp.lang.java
Subject Re: JUnit Test von JButton: Action wird nicht erkannt
Date 2016-07-19 18:59 +0200
Organization news.netcologne.de
Message-ID <nmlm94$vfk$1@newsreader4.netcologne.de> (permalink)
References <duo028Fb4qaU1@mid.individual.net> <nm8j8b$r9c$1@newsreader4.netcologne.de> <duqgrdFtso5U1@mid.individual.net> <nmbfkk$sk4$1@newsreader4.netcologne.de> <dv6mjhFqq9cU1@mid.individual.net>

Show all headers | View raw


Responding to Christian H. Kuhn:
>> Über SwingUtilities#invokeLater().
> 
> Mit den beiden invoke bin ich auch am Kämpfen. Beide sorgen auf dem EDT
> für eine klare Abfolge von Events. Nur invokeAndWait() sorgt aber auch
> für eine happens-before-Beziehung zwischen ausgeführten Befehlen auf dem
> aufrufenden Thread und dem EDT.

Nein!

Der Unterschied ist, dass #invokeLater() asynchron ist, d.h. der Aufruf
kehrt "sofort" zurück, und der übergebene Codeblock wird dann irgendwann
später auf dem EDT ausgeführt. #invokeAndWait() ist synchron, d.h. der
Aufruf kehrt erst zurück, wenn der Codeblock auf dem EDT tatsächlich
ausgeführt wurde. Wenn kein besonderer Anlass für die Verwendung von
#invokeAndWait() vorliegt, ist #invokeLater() zu bevorzugen.

In beiden Fällen entsteht *keine* happens-before-Beziehung zwischen
irgendwas. In dem Beispielschnipsel, den ich neulich hier hingeklebt
habe, hat man eine happens-before-Beziehung zwischen dem Schreiben in
die AtomicReference auf dem EDT und dem Lesen dieses Wertes auf dem
main-Thread. Und die entsteht eben durch die Verwendung von
AtomicReference, weil der Wert darin volatile gehalten wird.

Im Prinzip könnte man #invokeAndWait() z.B. dadurch emulieren, dass man
am Ende des #invokeLater() übergebenen Blocks ein CountdownLatch
triggert und direkt nach dem Aufruf von #invokeLater() auf dieses Latch
wartet. Dann hätte man tatsächlich eine happens-before-Beziehung
zwischen diesen beiden Latch-Interaktionen.

Wenn das noch fuzzy ist, war eine Stunde in der S-Bahn offenkundig nicht
ausreichend. :)

> Für manche Tests nicht unwichtig, die
> darauf warten müssen, dass das EDT-Ereignis auch ausgeführt ist, bevor
> der Test funktionieren kann. Dafür wirft invokeAndWait() eine Exception.
> In normalem Code kann die problemlos abgefangen und verarbeitet werden;
> in Runnables und actionPerformed muss man entweder eine try-catch mit
> leerem Catch-Block machen, was alle statischen Codechecker anmeckern,
> oder man macht im Catch-Block so Dinge wie
> 
> final Thread thread = Thread.currentThread();
> thread.getUncaughtExceptionHandler().uncaughtException(thread, e);
> 
> die auch keinen Schönheitspreis gewinnen.

Das klingt auch noch etwas konfus.

In beiden Fällen kann es passieren, dass der übergebene Block eine
Exception wirft. Im Fall von #invokeAndWait() wird diese dann, in eine
InvocationTargetException gewickelt, an den Aufrufer propagiert. Im Fall
von #invokeLater() hat man diese Option nicht, denn der Block wird ja
erst ausgeführt, nachdem der Aufruf zurückgekehrt ist. Also bleibt
nichts, als diese Exception *im EDT* hochblubbern zu lassen, was
wahrscheinlich auch eher unerwünscht ist. Um Exceptions im übergebenen
Block muss sich also in jedem Fall Gedanken machen.

Das Problem mit leeren catch-Blöcken ist sicher nicht rimäar, dass
Codechecker das nicht mögen. Und was ein #invokeAndWait() in einem
#actionPerformed() suchen könnte, will ich glaube ich gar nicht so genau
wissen... ;)

Viele Grüße,
Patrick

Back to de.comp.lang.java | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

JUnit Test von JButton: Action wird nicht erkannt "Christian H. Kuhn" <qno-news@qno.de> - 2016-07-14 01:09 +0200
  Re: JUnit Test von JButton: Action wird nicht erkannt "Christian H. Kuhn" <qno-news@qno.de> - 2016-07-14 18:26 +0200
  Re: JUnit Test von JButton: Action wird nicht erkannt Patrick Roemer <sangamon@netcologne.de> - 2016-07-14 19:47 +0200
    Re: JUnit Test von JButton: Action wird nicht erkannt "Christian H. Kuhn" <qno-news@qno.de> - 2016-07-15 00:08 +0200
      Re: JUnit Test von JButton: Action wird nicht erkannt Patrick Roemer <sangamon@netcologne.de> - 2016-07-15 22:04 +0200
        Re: JUnit Test von JButton: Action wird nicht erkannt "Christian H. Kuhn" <qno-news@qno.de> - 2016-07-15 22:53 +0200
        Re: JUnit Test von JButton: Action wird nicht erkannt "Christian H. Kuhn" <qno-news@qno.de> - 2016-07-15 23:09 +0200
          Re: JUnit Test von JButton: Action wird nicht erkannt Patrick Roemer <sangamon@netcologne.de> - 2016-07-15 23:44 +0200
            Countdown Timer Design (was: JUnit Test von JButton: Action wird nicht erkannt) "Christian H. Kuhn" <qno-news@qno.de> - 2016-07-16 23:44 +0200
              Re: Countdown Timer Design "Christian H. Kuhn" <qno-news@qno.de> - 2016-07-17 12:44 +0200
              Re: Countdown Timer Design "Christian H. Kuhn" <qno-news@qno.de> - 2016-07-17 15:49 +0200
                Re: Countdown Timer Design "Christian H. Kuhn" <qno-news@qno.de> - 2016-07-17 17:03 +0200
                Re: Countdown Timer Design "Christian H. Kuhn" <qno-news@qno.de> - 2016-07-19 15:59 +0200
        Re: JUnit Test von JButton: Action wird nicht erkannt "Christian H. Kuhn" <qno-news@qno.de> - 2016-07-19 14:59 +0200
          Re: JUnit Test von JButton: Action wird nicht erkannt "Christian H. Kuhn" <qno-news@qno.de> - 2016-07-19 16:06 +0200
          Re: JUnit Test von JButton: Action wird nicht erkannt Patrick Roemer <sangamon@netcologne.de> - 2016-07-19 18:59 +0200
            Re: JUnit Test von JButton: Action wird nicht erkannt "Christian H. Kuhn" <qno-news@qno.de> - 2016-07-19 22:35 +0200
              Re: JUnit Test von JButton: Action wird nicht erkannt Patrick Roemer <sangamon@netcologne.de> - 2016-07-20 13:00 +0200
                Re: JUnit Test von JButton: Action wird nicht erkannt "Christian H. Kuhn" <qno-news@qno.de> - 2016-07-23 20:36 +0200
                Re: JUnit Test von JButton: Action wird nicht erkannt "Christian H. Kuhn" <qno-news@qno.de> - 2016-07-23 23:15 +0200
          Re: JUnit Test von JButton: Action wird nicht erkannt Wanja Gayk <brixomatic@yahoo.com> - 2016-07-19 23:02 +0200
            Re: JUnit Test von JButton: Action wird nicht erkannt "Christian H. Kuhn" <qno-news@qno.de> - 2016-07-20 12:33 +0200
    GUI-Update über Swing-EDT (was: JUnit Test von JButton: Action wird nicht erkannt) "Christian H. Kuhn" <qno-news@qno.de> - 2016-07-15 12:03 +0200
      Re: GUI-Update über Swing-EDT Patrick Roemer <sangamon@netcologne.de> - 2016-07-15 22:43 +0200
        Re: GUI-Update über Swing-EDT "Christian H. Kuhn" <qno-news@qno.de> - 2016-07-15 23:18 +0200
        Re: GUI-Update über Swing-EDT "Christian H. Kuhn" <qno-news@qno.de> - 2016-07-16 15:24 +0200
          Re: GUI-Update über Swing-EDT Patrick Roemer <sangamon@netcologne.de> - 2016-07-16 16:42 +0200
            Re: GUI-Update über Swing-EDT "Christian H. Kuhn" <qno-news@qno.de> - 2016-07-16 23:05 +0200
              Re: GUI-Update über Swing-EDT "Christian H. Kuhn" <qno-news@qno.de> - 2016-07-17 16:02 +0200

csiph-web