views:

555

answers:

4

I'm trying to do something to track down the problem, but there's not much I can do until paintContents, and everything there looks good through my debugger, but I'll double check to make sure I didn't miss anything. At the very least, I would like to know how to silently handle these (such as catching them and being able to output a meaningful error message, since once it's thrown, the GUI stutters and freezes for a bit).

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at sun.java2d.pipe.DuctusShapeRenderer.renderPath(Unknown Source)
        at sun.java2d.pipe.DuctusShapeRenderer.draw(Unknown Source)
        at sun.java2d.pipe.PixelToParallelogramConverter.draw(Unknown Source)
        at sun.java2d.pipe.PixelToParallelogramConverter.draw(Unknown Source)
        at sun.java2d.SunGraphics2D.draw(Unknown Source)
        SNIP - MY CALL TO PAINT THE LAYER
        at com.jhlabs.map.layer.Layer.paintContents(Layer.java:70)
        at com.jhlabs.map.layer.Layer.paint(Layer.java:59)
        at com.jhlabs.map.layer.Layer.paintLayers(Layer.java:76)
        at com.jhlabs.map.layer.Layer.paintContents(Layer.java:68)
        at com.jhlabs.map.layer.Layer.paint(Layer.java:59)
        at com.jhlabs.Globe.paint(Globe.java:305)
        at javax.swing.JComponent.paintChildren(Unknown Source)
        at javax.swing.JComponent.paint(Unknown Source)
        at javax.swing.JComponent.paintToOffscreen(Unknown Source)
        at javax.swing.BufferStrategyPaintManager.paint(Unknown Source)
        at javax.swing.RepaintManager.paint(Unknown Source)
        at javax.swing.JComponent._paintImmediately(Unknown Source)
        at javax.swing.JComponent.paintImmediately(Unknown Source)
        at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
        at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
        at javax.swing.RepaintManager.seqPaintDirtyRegions(Unknown Source)
        at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknow
n Source)
        at java.awt.event.InvocationEvent.dispatch(Unknown Source)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)

The following source code is from the Java Map Projection Library.

Layer.paintContents:

public void paintContents(MapGraphics g) {
    if (g != null) {
        paintLayers(g);
        paintFeatures(g);
        paintLayer(g);
    }
}

Layer.paint:

public void paint(MapGraphics g) {
    if (isVisible()) {
        Graphics2D g2d = g.getGraphics2D();
        AffineTransform saveTransform = g2d.getTransform();
        Composite saveComposite = g2d.getComposite();
        Projection saveProjection = g.getProjection();
        Style saveStyle = g.getStyle();
        if (composite != null)
     g2d.setComposite(composite);
        if (transform != null)
     g2d.transform(transform);
        if (style != null)
     g.setStyle(style);
        if (projection != null)
     g.setProjection(projection);
        paintContents(g);
        g.setStyle(saveStyle);
        g.setProjection(saveProjection);
        g2d.setComposite(saveComposite);
        g2d.setTransform(saveTransform);
    }
}

Layer.paintLayers:

public void paintLayers(MapGraphics g) {
for (Iterator<Layer> it = getLayersIterator(); it.hasNext();) {
    Layer l = (Layer) it.next();
    l.paint(g);
}
}

Globe.paint:

public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;

// Turn on antialiasing - otherwise it looks horrible
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

// Put the origin at bottom left
g2.translate(0, getHeight());
g2.scale(1, -1);

// Put the globe in the middle
g2.translate(getWidth() / 2, getHeight() / 2);

Point2D.Float p = new Point2D.Float(1, 0);
transform.deltaTransform(p, p);
float rscale = 1.0f / (float) Math.sqrt(p.x * p.x + p.y * p.y);
g2.setStroke(new BasicStroke(rscale * 0.5f));

MapGraphics mg = MapGraphics.getGraphics(g2, new Rectangle(getSize()));
seaLayer.setVisible(showSea);
tissotLayer.setVisible(showTissot);
worldLayer.setVisible(showWorld);
graticuleLayer.setVisible(showGraticule);
map.paint(mg);

if (showNight) {
    Color c = new Color(0, 0, 0, 0.5f);
    GeneralPath gc = new GeneralPath();
    ProjectionPainter.smallCircle(45, 5, 87, 180, gc, true);
    gc.closePath();
    ProjectionPainter pp = ProjectionPainter.getProjectionPainter(projection);
    pp.drawPath(g2, gc, null, c);

}

}
A: 

It means that while handling an event (looks like a repaint in this case) a NullPointerException was thrown. That means you tried to call a method on an object, and it turned out to be null.

Something on line 70 in the paintContents() method of the com.jhlabs.map.layer.Layer class has a null reference.

Nate
A: 

I don't know which IDE you are using, but in Eclipse you can tell the Debugger to break at specifiv types of exceptions, e.g. NPEs.

You could run your App in Debugmodus with this option turned on and try to reproduce the error so that you can check in your Debugger what's wrong.

moxn
+1  A: 

I see in your stack trace a blanked out region defined by the line:

SNIP - MY CALL TO PAINT THE LAYER

That code calls SunGraphics2D.draw(Shape). I dont see that call in the code that you have edited in. However, it looks as though the Shape that you are passing into SunGraphics2D.draw() is null.

akf
Apparently, I was hitting an case that wasn't documented in the mapping library. When I used it's ProjectionPainter class to get a shape, if the shape was not visible on the current view, it returned null.
Thomas Owens
A: 

Check if the source code of the sun lib is available. If so: Instruct you debuger to hold execution when a NPE is thrown. Then you can check the object that is null and guess (or backtrack) which object should be in that reference

Jens Schauder