2012-03-18 8 views
7

La mia versione di Java è:validateTree in Java lavoro 7.x pretende molto (in Java 6.x andava bene)

Java Plug-in 10.3.1.255 Utilizzando JRE versione 1.7.0_03-b05 Java HotSpot (TM) Cliente VM

Così, quando ho avuto la versione 6.x tutto andava bene, dopo l'aggiornamento ho questo:

 
    Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: This function should be called while holding treeLock 
     at java.awt.Component.checkTreeLock(Component.java:1196) 
     at java.awt.Container.validateTree(Container.java:1682) 
     at pl.recorder.ScenarioWindow.showUploadPanel(PlayerWindow.java:721) 
     at pl.recorder.actions.UploadFilesAction.execute(DesignFilesAction.java:71) 
     at pl.recorder.actions.EndTestAction.actionPerformed(EndTestAction.java:91) 
     at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018) 
     at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341) 
     at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
     at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
     at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
     at java.awt.Component.processMouseEvent(Component.java:6505) 
     at javax.swing.JComponent.processMouseEvent(JComponent.java:3321) 
     at java.awt.Component.processEvent(Component.java:6270) 
     at java.awt.Container.processEvent(Container.java:2229) 
     at java.awt.Component.dispatchEventImpl(Component.java:4861) 
     at java.awt.Container.dispatchEventImpl(Container.java:2287) 
     at java.awt.Component.dispatchEvent(Component.java:4687) 
     at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) 
     at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492) 
     at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) 
     at java.awt.Container.dispatchEventImpl(Container.java:2273) 
     at java.awt.Window.dispatchEventImpl(Window.java:2713) 
     at java.awt.Component.dispatchEvent(Component.java:4687) 
     at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707) 
     at java.awt.EventQueue.access$000(EventQueue.java:101) 
     at java.awt.EventQueue$3.run(EventQueue.java:666) 
     at java.awt.EventQueue$3.run(EventQueue.java:664) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
     at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) 
     at java.awt.EventQueue$4.run(EventQueue.java:680) 
     at java.awt.EventQueue$4.run(EventQueue.java:678) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
     at java.awt.EventQueue.dispatchEvent(EventQueue.java:677) 
     at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211) 
     at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128) 
     at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117) 
     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113) 
     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105) 
     at java.awt.EventDispatchThread.run(EventDispatchThread.java:90) 

ho cambiato validateTree()-validate() e sorpresa;) - Evert hing funziona bene, ma non so se questo cambiamento funzionerà anche su java 6.x (immagino di no). Come posso cambiare questo codice per funzionare in Java 6x e 7x.

+0

Quale codice? Vedi anche [Initial Threads] (http://download.oracle.com/javase/tutorial/uiswing/concurrency/initial.html). – trashgod

risposta

0

io non sono del tutto sicuro, ma penso che si può utilizzare:

System.getProperty("java.version"); 

Basta verificare se si tratta di 6 o 7 e fare qualcosa di diverso a seconda che.

10

"Non è un bug, è una caratteristica" di Java 7;)

Questa funzione dovrebbe essere chiamata mentre si tiene treeLock

Questo è quello di costringere la scrittura:

+0

Appena ricevuto uno di questi problemi quando uno dei miei vecchi programmi ha smesso di funzionare quando presumo che il client abbia aggiornato Java a 1.7. Questo ha risolto il problema :) Nel mio caso volevo assicurarmi che le operazioni siano fatte quando la dimensione dei componenti contenenti è nota e la convalida non era sufficiente. – Boro

8

In risposta alla risposta di @ vince, penso che sia istruttivo guardare a quale sia il Java 1.4.2 javadoc per il Metodo dice:

protected void validateTree()

scende ricorsivamente l'albero contenitore e ricalcola il layout per le sottostrutture contrassegnati come averne bisogno (quelli contrassegnati come non valido). La sincronizzazione dovrebbe essere fornita dal metodo che chiama questo: validate.

(corsivo.)

Il modo di leggere questo, è dire che il metodo è progettato essere chiamati da validate() che sarà (presumibilmente) organizza la serratura albero.

Nota che il testo è identico in Java 6 e Java 7. Le specifiche non è cambiato ...

Ora a quanto pare c'è codice di applicazione là fuori che chiama validateTree() direttamente ... senza acquisire il blocco albero . Presumibilmente, ciò si traduce in problemi non riproducibili (Heisenbugs) quando l'utente finale fa clic troppo velocemente o qualcosa del genere. Presumibilmente, il cambiamento in Java 7 è stato progettato per portare questo uso errato/buggy di validateTree() all'attenzione degli sviluppatori.

OK, quindi questo è un dolore a breve termine.Ma nel lungo periodo, tutti vittorie (a parte gli avvocati :-)):

  • Oracle non ottiene segnalazioni di bug per comportamento strano irriproducibile che è in realtà il problema del programmatore dell'applicazione.

  • Gli sviluppatori non ricevono segnalazioni di bug dai clienti per strani comportamenti non riproducibili.

  • Gli utenti finali ottengono applicazioni che funzionano meglio.

+0

So che questo è vecchio, ma questo mi ha aiutato e mi piace aggiungere i miei due centesimi. 'validateTree' è protetto, quindi dovresti chiamare' validate' invece (fa i passi sincronizzati). Inoltre, in Java 7 hanno aggiunto una chiamata a 'checkTreeLock()' su 'validateTree', ecco perché l'errore si verifica – Montolide