2013-12-09 20 views
0

今天晚上,當我拖放一個早上運行良好的項目時,我仍然會收到數千個這樣的錯誤。我有140個類,我不能跟蹤我所做的所有修改:(但我從來沒有改變任何與拖放功能相關的東西。我已經完全遠離代碼中的這一行,拋出這些。例外 這是我的代碼的一部分導致異常:無關的java.io.NotSerializableException總是引用相同的代碼行

Object obj = ts.getTransferable().getTransferData(TransferableProductJob.PRODUCTJOB_DATA_FLAVOR); 

我已經從該行的堆棧跟蹤的追查:

at View.panels.WaitingListJPanel$JListTransferHandler.importData(WaitingListJPanel.java:209) 

完整的堆棧跟蹤是:

dic 10, 2013 12:21:45 AM View.panels.WaitingListJPanel$JListTransferHandler importData 
SEVERE: null 
java.io.NotSerializableException: View.panels.BarsJPanel$1 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1180) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346) 
    at java.util.ArrayList.writeObject(ArrayList.java:710) 
    at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:975) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174) 
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1528) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1493) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174) 
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1528) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1493) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346) 
    at sun.awt.datatransfer.TransferableProxy.getTransferData(TransferableProxy.java:83) 
    at java.awt.dnd.DropTargetContext$TransferableProxy.getTransferData(DropTargetContext.java:376) 
    at View.panels.WaitingListJPanel$JListTransferHandler.importData(WaitingListJPanel.java:209) 
    at javax.swing.TransferHandler$DropHandler.drop(TransferHandler.java:1536) 
    at java.awt.dnd.DropTarget.drop(DropTarget.java:450) 
    at javax.swing.TransferHandler$SwingDropTarget.drop(TransferHandler.java:1274) 
    at sun.awt.dnd.SunDropTargetContextPeer.processDropMessage(SunDropTargetContextPeer.java:537) 
    at sun.awt.dnd.SunDropTargetContextPeer$EventDispatcher.dispatchDropEvent(SunDropTargetContextPeer.java:851) 
    at sun.awt.dnd.SunDropTargetContextPeer$EventDispatcher.dispatchEvent(SunDropTargetContextPeer.java:775) 
    at sun.awt.dnd.SunDropTargetEvent.dispatch(SunDropTargetEvent.java:48) 
    at java.awt.Component.dispatchEventImpl(Component.java:4716) 
    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.processDropTargetEvent(Container.java:4566) 
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4417) 
    at java.awt.Container.dispatchEventImpl(Container.java:2273) 
    at java.awt.Window.dispatchEventImpl(Window.java:2719) 
    at java.awt.Component.dispatchEvent(Component.java:4687) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:723) 
    at java.awt.EventQueue.access$200(EventQueue.java:103) 
    at java.awt.EventQueue$3.run(EventQueue.java:682) 
    at java.awt.EventQueue$3.run(EventQueue.java:680) 
    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:696) 
    at java.awt.EventQueue$4.run(EventQueue.java:694) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:693) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:97) 

我attemps:

  • 我做這些都表明這個 異常短暫的所有類引用或我讓他們的序列化的一個子類(也許 它是超過40類完成)
  • 有時。我有一個錯誤 說不是一個有效的類構造函數,在這種情況下,我添加了一個 受保護的默認構造函數。所以我繼續對其他類有以上 例外。
  • 新的Attemp:我試圖刪除barJPanel和所有相關的類,我看到異常消失,但DnD已停止工作。這很令人傷心,因爲我沒有改變DnD部分的任何代碼。我認爲它在一些類中使用默認構造函數創建新對象時很愚蠢。我的構造函數很複雜,我想知道Java如何使用默認構造函數來操作類。

順便說一下。

  1. 所有序列化類在我的應用程序有自己的serialVersionUID
  2. 我從來沒有使用在整個應用程序直接或間接相關的系列化什麼。所以不要問我的代碼。這都是JVM。

主要問題是我無法繼續我的嘗試,因爲BarsJPanel是可序列化的,因爲它是JPanel的子類,並且使其暫時不能解決任何問題。


添加匿名類代碼:(GalvanicMachine是序列化)

galvanicMachine.addProductJobsListener(new IProductJobsListener() { 

     @Override 
     public void productJobAdded(ProductJob pj) { 
      SwingUtilities.invokeLater(new Runnable() { 

       @Override 
       public void run() { 
        reconstructPanelMap(); 
       } 
      });    
     } 

     @Override 
     public void productJobRemoved(ProductJob pj) { 
      SwingUtilities.invokeLater(new Runnable() { 

       @Override 
       public void run() { 
        reconstructPanelMap(); 
       } 
      }); 
     } 
    }); 
+0

'View.panels.BarsJPanel $ 1'是'View.panels.BarsJPanel'的一個_anonymous內部類,***不是***的子類,它想要序列化但本身不是可序列化的。 –

+0

我只有一個匿名類,它是一個Listener!我不認爲讓聽衆可串行化是一個好主意。 swing是否將所有監聽器序列化。爲什麼我在創建匿名偵聽器類作爲偵聽器時不會收到任何警告? – Johnny

+0

如果對匿名實例的引用存儲在'BarsJPanel'的成員中,那麼當串行化BarsJPanel時,它將被序列化。標記該參考瞬態。 –

回答

1

GalvanicMachine有一個成員的收集,存儲引用的匿名IProductJobsListener實現的實例。存儲這些引用的集合必須是transient,或者實現實例必須是Serializable

ActionListener不是(子類)JButton的一個實例,它被包含在一個JButton。序列化ActionListener沒有多大意義。

+0

但我沒有告訴ActionListener是JButton的一個實例。我覺得AbstractButton有一個ActionListeners列表,我在這個程序中爲GalvanicMachine和IProductJobListener準備了這個東西。 – Johnny

相關問題