ModernDocking icon indicating copy to clipboard operation
ModernDocking copied to clipboard

1.1 Exception: io.github.andrewauclair.moderndocking.exception.DockingLayoutException

Open tlf30 opened this issue 7 months ago • 4 comments

Hello @andrewauclair,

I just updated to 1.1, and am seeing this exception. The exception is thrown on app statup.

Apr 28, 2025 6:53:55 PM io.github.andrewauclair.moderndocking.api.AppStateAPI$1 actionPerformed
WARNING: null
io.github.andrewauclair.moderndocking.exception.DockingLayoutException
	at io.github.andrewauclair.moderndocking.api.LayoutPersistenceAPI.saveLayoutToFile(LayoutPersistenceAPI.java:106)
	at io.github.andrewauclair.moderndocking.api.AppStateAPI$1.actionPerformed(AppStateAPI.java:178)
	at java.desktop/javax.swing.Timer.fireActionPerformed(Timer.java:311)
	at java.desktop/javax.swing.Timer$DoPostEvent.run(Timer.java:243)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:720)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:714)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: java.lang.NullPointerException: Cannot invoke "String.length()" because "content" is null
	at java.xml/com.sun.xml.internal.stream.writers.XMLStreamWriterImpl.writeXMLContent(XMLStreamWriterImpl.java:1487)
	at java.xml/com.sun.xml.internal.stream.writers.XMLStreamWriterImpl.writeAttribute(XMLStreamWriterImpl.java:554)
	at io.github.andrewauclair.moderndocking.api.LayoutPersistenceAPI.writeTabbedNodeToFile(LayoutPersistenceAPI.java:410)
	at io.github.andrewauclair.moderndocking.api.LayoutPersistenceAPI.writeNodeToFile(LayoutPersistenceAPI.java:333)
	at io.github.andrewauclair.moderndocking.api.LayoutPersistenceAPI.saveLayoutToFile(LayoutPersistenceAPI.java:319)
	at io.github.andrewauclair.moderndocking.api.LayoutPersistenceAPI.saveLayoutToOutputStream(LayoutPersistenceAPI.java:124)
	at io.github.andrewauclair.moderndocking.api.LayoutPersistenceAPI.saveLayoutToFile(LayoutPersistenceAPI.java:104)
	... 16 more

And when attempting to pin to the side, I see the same exception and the dockable disappears.

The docking overlay is rendering odd too:

Image

tlf30 avatar Apr 29 '25 03:04 tlf30

After restarting the app so it generated a layout xml. I also get this error on startup now:

io.github.andrewauclair.moderndocking.exception.DockingLayoutException: null
	at io.github.andrewauclair.moderndocking.api.LayoutPersistenceAPI.loadApplicationLayoutFromFile(LayoutPersistenceAPI.java:162) ~[modern-docking-api-1.1.jar:?]
	at io.github.andrewauclair.moderndocking.api.AppStateAPI.restore(AppStateAPI.java:223) ~[modern-docking-api-1.1.jar:?]
	at io.github.andrewauclair.moderndocking.app.AppState.restore(AppState.java:113) ~[modern-docking-single-app-1.1.jar:?]
	at io.tlf.ow.fob.manager.ui.MainWindow.lambda$init$0(MainWindow.java:66) ~[main/:?]
	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318) [?:?]
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773) [?:?]
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:720) [?:?]
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:714) [?:?]
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:400) ~[?:?]
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87) ~[?:?]
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742) ~[?:?]
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203) ~[?:?]
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) ~[?:?]
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:117) ~[?:?]
	at java.desktop/java.awt.WaitDispatchSupport$2.run(WaitDispatchSupport.java:191) ~[?:?]
	at java.desktop/java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:236) ~[?:?]
	at java.desktop/java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:234) ~[?:?]
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:319) [?:?]
	at java.desktop/java.awt.WaitDispatchSupport.enter(WaitDispatchSupport.java:234) ~[?:?]
	at java.desktop/java.awt.Dialog.show(Dialog.java:1079) ~[?:?]
	at java.desktop/java.awt.Component.show(Component.java:1728) ~[?:?]
	at java.desktop/java.awt.Component.setVisible(Component.java:1675) ~[?:?]
	at java.desktop/java.awt.Window.setVisible(Window.java:1036) ~[?:?]
	at java.desktop/java.awt.Dialog.setVisible(Dialog.java:1015) ~[?:?]
	at org.jdesktop.swingx.JXTipOfTheDay.showDialog(JXTipOfTheDay.java:400) ~[swingx-all-1.6.5-1.jar:1.6.5-1]
	at org.jdesktop.swingx.JXTipOfTheDay.showDialog(JXTipOfTheDay.java:367) ~[swingx-all-1.6.5-1.jar:1.6.5-1]
	at io.tlf.ow.fob.manager.FobManager.lambda$initWindow$0(FobManager.java:211) ~[main/:?]
	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318) ~[?:?]
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773) ~[?:?]
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:720) ~[?:?]
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:714) ~[?:?]
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:400) [?:?]
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87) [?:?]
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742) [?:?]
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203) [?:?]
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) [?:?]
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113) [?:?]
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109) [?:?]
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) [?:?]
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90) [?:?]
Caused by: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[22,85]
Message: XML document structures must start and end within the same entity.
	at java.xml/com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:652) ~[?:?]
	at java.xml/com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.nextTag(XMLStreamReaderImpl.java:1353) ~[?:?]
	at io.github.andrewauclair.moderndocking.api.LayoutPersistenceAPI.readTabNodeFromFile(LayoutPersistenceAPI.java:678) ~[modern-docking-api-1.1.jar:?]
	at io.github.andrewauclair.moderndocking.api.LayoutPersistenceAPI.readNodeFromFile(LayoutPersistenceAPI.java:554) ~[modern-docking-api-1.1.jar:?]
	at io.github.andrewauclair.moderndocking.api.LayoutPersistenceAPI.readLayoutFromReader(LayoutPersistenceAPI.java:512) ~[modern-docking-api-1.1.jar:?]
	at io.github.andrewauclair.moderndocking.api.LayoutPersistenceAPI.loadApplicationLayoutFromInputStream(LayoutPersistenceAPI.java:182) ~[modern-docking-api-1.1.jar:?]
	at io.github.andrewauclair.moderndocking.api.LayoutPersistenceAPI.loadApplicationLayoutFromFile(LayoutPersistenceAPI.java:160) ~[modern-docking-api-1.1.jar:?]
	... 39 more

EDIT: This is the contents of the generated XML (Yes, it is cut off like that in the file)

<?xml version="1.0" ?>
<app-layout>
<layout main-frame="true" location="439,183" size="828,653" state="0">
<westToolbar>
</westToolbar>
<eastToolbar>
</eastToolbar>
<southToolbar>
</southToolbar>
<tabbed>
<selectedTab class-name="io.tlf.ow.fob.manager.ui.panes.RgaPane" persistentID="rga" anchor="">
</selectedTab>
<tab persistentID="rga" class-name="io.tlf.ow.fob.manager.ui.panes.RgaPane" anchor="

tlf30 avatar Apr 29 '25 03:04 tlf30

Looks like one of the anchor strings is likely null when loading an old layout. Auto hide appears to not work at all because I have the code commented out... I'll get these sorted out today in a 1.1.1 release.

andrewauclair avatar Apr 29 '25 11:04 andrewauclair

Thanks, in this case there is no old layout. I can delete the layout xml to get the error.

tlf30 avatar Apr 29 '25 17:04 tlf30

I think I just reproduced your first stacktrace on 1.1.1 and it's due to some null anchor values in InternalRootDockingPanel dock.

io.github.andrewauclair.moderndocking.exception.DockingLayoutException at io.github.andrewauclair.moderndocking.api.LayoutPersistenceAPI.saveLayoutToFile(LayoutPersistenceAPI.java:106) at io.github.andrewauclair.moderndocking.api.AppStateAPI$1.actionPerformed(AppStateAPI.java:178) at java.desktop/javax.swing.Timer.fireActionPerformed(Timer.java:311) at java.desktop/javax.swing.Timer$DoPostEvent.run(Timer.java:243) at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318) at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:720) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:714) at java.base/java.security.AccessController.doPrivileged(AccessController.java:400) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87) at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742) at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203) at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90) Caused by: java.lang.NullPointerException: Cannot invoke "String.length()" because "content" is null at java.xml/com.sun.xml.internal.stream.writers.XMLStreamWriterImpl.writeXMLContent(XMLStreamWriterImpl.java:1487) at java.xml/com.sun.xml.internal.stream.writers.XMLStreamWriterImpl.writeAttribute(XMLStreamWriterImpl.java:554) at io.github.andrewauclair.moderndocking.api.LayoutPersistenceAPI.writeTabbedNodeToFile(LayoutPersistenceAPI.java:410) at io.github.andrewauclair.moderndocking.api.LayoutPersistenceAPI.writeNodeToFile(LayoutPersistenceAPI.java:333) at io.github.andrewauclair.moderndocking.api.LayoutPersistenceAPI.writeSplitNodeToFile(LayoutPersistenceAPI.java:386) at io.github.andrewauclair.moderndocking.api.LayoutPersistenceAPI.writeNodeToFile(LayoutPersistenceAPI.java:330) at io.github.andrewauclair.moderndocking.api.LayoutPersistenceAPI.saveLayoutToFile(LayoutPersistenceAPI.java:319) at io.github.andrewauclair.moderndocking.api.LayoutPersistenceAPI.saveLayoutToOutputStream(LayoutPersistenceAPI.java:124) at io.github.andrewauclair.moderndocking.api.LayoutPersistenceAPI.saveLayoutToFile(LayoutPersistenceAPI.java:104) ... 16 more

andrewauclair avatar Apr 30 '25 16:04 andrewauclair