2012-03-18 20 views
7

Mi versión de Java es:validateTree en Java trabajo 7.x duerma (en Java 6.x estaba bien)

Java Plug-in 10.3.1.255 Usando JRE versión 1.7.0_03-b05 Java HotSpot (TM) VM cliente

Así que cuando tuve la versión 6.x que todo estaba bien, después de actualizar tengo esto:

 
    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) 

he cambiado validateTree()-validate() y sorpresa;) - Evert hing funciona bien, pero no sé si este cambio también funcionará en java 6.x (supongo que no). Cómo puedo cambiar este código para que funcione en Java 6x y 7x.

+0

¿Qué código? Ver también [Temas iniciales] (http://download.oracle.com/javase/tutorial/uiswing/concurrency/initial.html). – trashgod

Respuesta

0

No estoy del todo seguro, pero creo que se puede utilizar:

System.getProperty("java.version"); 

Sólo comprobar si es 6 o 7 y hacer algo diferente en función de eso.

10

"No es un insecto, él es una característica" de Java 7;)

Esta función debe ser llamada mientras mantiene treeLock

Esto es para obligar a escribir:

synchronized(getTreeLock()) { 
    validateTree(); 
} 
+0

Acabo de recibir uno de estos problemas cuando uno de mis programas anteriores dejó de funcionar cuando supongo que el cliente actualizó su Java a 1.7. Esto resolvió el problema :) En mi caso, quería asegurarme de que las operaciones se realicen cuando se conozca el tamaño de los componentes que contienen y la validación no sea suficiente. – Boro

8

En respuesta a la respuesta de @vince, creo que es instructivo mirar lo que Java 1.4.2 javadoc para el Método dice:

protected void validateTree()

desciende recursivamente el árbol de contenedores y vuelve a calcular la distribución de las sub-estructuras marcadas como que lo necesitan (los marcados como no válidos). La sincronización debe ser proporcionada por el método que llama a este: validate.

(Énfasis añadido.)

La forma en que leí esto, se está diciendo que el método es diseñada para ser llamado por validate() que será (probablemente) se mantiene el bloqueo de árbol.

Tenga en cuenta que el texto es idéntico en Java 6 y 7. La especificación de Java no ha cambiado ...

Ahora al parecer hay un código de aplicación por ahí que está llamando validateTree() directamente ... sin adquirir el bloqueo del árbol . Presumiblemente, esto genera problemas irreproducibles (Heisenbugs) cuando el usuario final hace clic demasiado rápido o algo así. Presumiblemente, el cambio en Java 7 está diseñado para llevar este uso incorrecto/incorrecto de validateTree() a la atención de los desarrolladores.

Bien, este es un dolor a corto plazo.Pero a largo plazo, todos victorias (aparte de los abogados :-)):

  • Oracle no recibe informes de errores para el comportamiento irreproducible extraño que es realmente el problema del programador de la aplicación.

  • Los desarrolladores no reciben informes de errores de los clientes por un comportamiento extraño no reproducible.

  • Los usuarios finales obtienen aplicaciones que funcionan mejor.

+0

Sé que esto es viejo, pero esto me ayudó y me gustaría agregar mis dos centavos. 'validateTree' está protegido, por lo que debe llamar a' validate' en su lugar (realiza los pasos sincronizados). Además, en Java 7 agregaron una llamada a 'checkTreeLock()' en 'validateTree', por eso ocurre el error – Montolide