Skip to content

Divided by zero ArithmeticException in AbstractTileFactory (v2.6) #114

@Ulathar

Description

@Ulathar

Hi there,

I am getting a divided by zero Exception in the AbstractTileFactory whenever the JXMapViewer is not visible (hidden/collapsed in the UI):

java.lang.ArithmeticException: / by zero
	org.jxmapviewer.viewer.AbstractTileFactory.getTile(AbstractTileFactory.java:92)
	org.jxmapviewer.viewer.AbstractTileFactory.getTile(AbstractTileFactory.java:78)
	org.jxmapviewer.JXMapViewer.drawMapTiles(JXMapViewer.java:234)
	org.jxmapviewer.JXMapViewer.doPaintComponent(JXMapViewer.java:168)
	org.jxmapviewer.JXMapViewer.paintComponent(JXMapViewer.java:151)
	java.desktop/javax.swing.JComponent.paint(JComponent.java:1075)
	java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:908)
	java.desktop/javax.swing.JComponent.paint(JComponent.java:1084)
	java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:908)
	java.desktop/javax.swing.JSplitPane.paintChildren(JSplitPane.java:1024)
	java.desktop/javax.swing.JComponent.paint(JComponent.java:1084)
	java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:908)
	java.desktop/javax.swing.JComponent.paint(JComponent.java:1084)
	java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:908)
	java.desktop/javax.swing.JComponent.paint(JComponent.java:1084)
	java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:908)
	java.desktop/javax.swing.JComponent.paint(JComponent.java:1084)
	java.desktop/javax.swing.JLayeredPane.paint(JLayeredPane.java:590)
	java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:908)
	java.desktop/javax.swing.JComponent.paint(JComponent.java:1084)
	java.desktop/javax.swing.JComponent.paintToOffscreen(JComponent.java:5256)
	java.desktop/javax.swing.RepaintManager$PaintManager.paintDoubleBufferedImpl(RepaintManager.java:1633)
	java.desktop/javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1608)
	java.desktop/javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1546)
	java.desktop/javax.swing.RepaintManager.paint(RepaintManager.java:1313)
	java.desktop/javax.swing.JComponent._paintImmediately(JComponent.java:5204)
	java.desktop/javax.swing.JComponent.paintImmediately(JComponent.java:5014)
	java.desktop/javax.swing.RepaintManager$4.run(RepaintManager.java:857)
	java.desktop/javax.swing.RepaintManager$4.run(RepaintManager.java:840)
	java.base/java.security.AccessController.doPrivileged(Native Method)
	java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:89)
	java.desktop/javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:840)
	java.desktop/javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:815)
	java.desktop/javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:764)
	java.desktop/javax.swing.RepaintManager.access$1200(RepaintManager.java:69)
	java.desktop/javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1880)
	java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
	java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:764)
	java.desktop/java.awt.EventQueue.access$500(EventQueue.java:97)
	java.desktop/java.awt.EventQueue$3.run(EventQueue.java:717)
	java.desktop/java.awt.EventQueue$3.run(EventQueue.java:711)
	java.base/java.security.AccessController.doPrivileged(Native Method)
	java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:89)
	java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:734)
	eu.sag.mmfw.proxy.EventQueueProxy.dispatchEvent(EventQueueProxy.java:40)
	java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:199)
	java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
	java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
	java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

Taking a closer look it seems like there is no check in the AbstractTileFactory for the case that (int) getMapSize(zoom).getWidth() returns 0 resulting in divided by zero at tileX = tileX % numTilesWide;:

private Tile getTile(int tpx, int tpy, int zoom, boolean eagerLoad)
    {
        // wrap the tiles horizontally --> mod the X with the max width
        // and use that
        int tileX = tpx;// tilePoint.getX();
        int numTilesWide = (int) getMapSize(zoom).getWidth();
        if (tileX < 0)
        {
            tileX = numTilesWide - (Math.abs(tileX) % numTilesWide);
        }

        tileX = tileX % numTilesWide;
...
}

Is this supposed to happen and the error is on m side?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions