簡體   English   中英

Java 7.x中的validateTree不起作用(在Java 6.x中很好)

[英]validateTree in Java 7.x doesnt work (in Java 6.x was fine)

我的java版本是:

Java Plug-in 10.3.1.255使用JRE版本1.7.0_03-b05 Java HotSpot(TM)客戶端VM

所以當我有版本6.x一切都很好,升級后我得到了這個:

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)

我將validateTree()更改為validate()和suprise;) - everthing工作正常,但我不知道這個更改是否也適用於java 6.x(我猜不是)。 如何更改此代碼以在Java 6x和7x中工作。

“這不是一個bug,它是java 7的一個特性”;)

應該在持有treeLock時調用此函數

這是強迫你寫作:

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

為了回應@ vince的回答,我認為查看該方法的Java 1.4.2 javadoc說明了什么是有益的:

protected void validateTree()

遞歸地下降容器樹並重新計算標記為需要的任何子樹的布局(標記為無效的子樹)。 應該通過調用此方法的方法提供同步: validate

(重點補充。)

我讀這篇文章的方式是,該方法被設計為由validate()調用,它將(可能)持有樹鎖。

請注意,Java 6和Java 7中的文本完全相同。規范沒有改變......

現在顯然有應用程序代碼直接調用validateTree()而沒有獲取樹鎖。 據推測,當最終用戶點擊太快或某事時,這會導致無法解決的問題(Heisenbugs)。 據推測,Java 7中的更改旨在將validateTree()錯誤/錯誤使用引入開發人員的注意力。

好的,所以這是短暫的痛苦。 但從長遠來看, 每個人都獲勝(除了律師:-)):

  • Oracle沒有針對奇怪的不可重現行為獲取錯誤報告,這些行為確實是應用程序員的問題。

  • 開發人員不會因為奇怪的不可復制行為而收到客戶的錯誤報告。

  • 最終用戶可以獲得更好的應用程序。

我不完全確定,但我認為你可以使用:

System.getProperty("java.version");

只需檢查是否為6或7,並根據具體情況做一些不同的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM