2012-03-18 19 views
7

जावा का मेरा संस्करण है:validateTree जावा 7.x does not काम में (जावा में 6.x ठीक था)

जावा प्लग-इन 10.3.1.255 JRE संस्करण का उपयोग करना 1.7.0_03-B05 जावा हॉटस्पॉट (टीएम) क्लाइंट वीएम

तो जब मैं था उन्नयन मैं इस मिल गया है के बाद संस्करण 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() और आश्चर्य की बात करने के लिए बदल;) - एवर्ट हिंग ठीक काम करता है, लेकिन मुझे नहीं पता कि यह परिवर्तन जावा 6.x पर भी काम करेगा (मुझे नहीं लगता)। जावा 6x और 7x में काम करने के लिए मैं इस कोड को कैसे बदल सकता हूं।

+0

क्या कोड? यह भी देखें [प्रारंभिक धागे] (http://download.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)। – trashgod

उत्तर

0

मैं पूरी तरह यकीन नहीं है, लेकिन मुझे लगता है कि आप का उपयोग कर सकते हैं:

System.getProperty("java.version"); 

बस की जांच अगर यह 6 या 7 है और कुछ अलग है कि के आधार पर करते हैं।

10

जावा 7 की "यह एक बग, यह एक सुविधा है है";)

यह फ़ंक्शन कॉल किया जाना चाहिए

treeLock दबाते हुए यह आप लिख मजबूर करने के लिए है:

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

जब मुझे लगता है कि क्लाइंट ने जावा को 1.7 पर अपडेट किया है तो मेरे पुराने कार्यक्रमों में से एक काम करना बंद कर देता है। इस मुद्दे को हल किया गया :) मेरे मामले में मैं यह सुनिश्चित करना चाहता था कि परिचालन किए जाते हैं जब घटकों के आकार को जाना जाता है और मान्य नहीं किया जाता है। – Boro

8

@ विन्स के उत्तर के जवाब में, मुझे लगता है कि यह देखने के लिए निर्देशक है कि Java 1.4.2 javadoc क्या है विधि का कहना है:

protected void validateTree()

रिकर्सिवली कंटेनर पेड़ उतरता है और लेआउट के लिए किसी भी subtrees यह जरूरत के रूप में चिह्नित है (जैसा कि अवैध चिह्नित किए गए) recomputes। सिंक्रनाइज़ेशन विधि द्वारा प्रदान किया जाना चाहिए जो इसे कॉल करता है: validate

(जोर जोड़ा।)

तरह से मैं इस पढ़ें, यह कह रही है कि विधि तैयार किया गया validate() जो (शायद) पेड़ ताला लेंगे द्वारा कहा जा रहा है।

ध्यान दें कि पाठ जावा 6 और जावा 7. कल्पना नहीं बदला है में समान है ...

अब जाहिरा तौर पर वहाँ आवेदन कोड वहाँ बाहर है कि validateTree() सीधे बुला रहा है ... पेड़ ताला प्राप्त करने के बिना । संभवतः, परिणामस्वरूप अप्रत्याशित समस्याएं (हेइज़ेनबग) होती हैं जब अंतिम उपयोगकर्ता बहुत तेज या कुछ क्लिक करता है। संभवतः, जावा 7 में परिवर्तन डेवलपर्स के ध्यान में validateTree() के इस गलत/छोटी गाड़ी के उपयोग को लाने के लिए डिज़ाइन किया गया है।

ठीक है, तो यह अल्पावधि दर्द है।लेकिन लंबे समय तक, हर किसी जीत (अलग वकीलों :-) से):

  • ओरेकल अजीब unreproducible व्यवहार वास्तव में आवेदन प्रोग्रामर की समस्या यह है कि के लिए बग रिपोर्ट नहीं प्राप्त करता है।

  • डेवलपर्स को अजीब अपरिवर्तनीय व्यवहार के लिए ग्राहकों से बग रिपोर्ट नहीं मिलती हैं।

  • अंतिम उपयोगकर्ताओं को ऐसे अनुप्रयोग मिलते हैं जो बेहतर काम करते हैं।

+0

मुझे पता है कि यह पुराना है, लेकिन इससे मुझे मदद मिली और मैं अपने दो सेंट जोड़ना पसंद करता हूं। 'validateTree' संरक्षित है, इसलिए आपको इसके बजाय 'मान्य' कॉल करना चाहिए (यह synchonized चरणों करता है)। इसके अलावा, जावा 7 में उन्होंने 'validateTree' पर 'checkTreeLock()' पर एक कॉल जोड़ा, यही कारण है कि त्रुटि होती है – Montolide

संबंधित मुद्दे