2009-07-17 46 views
2

我试图做一些事情来追踪问题,但直到paintContents和其中的所有内容都通过调试器看起来很不错,我会仔细检查以确保我没有遗漏任何东西。至少,我想知道如何静静地处理这些(比如捕获它们并能够输出有意义的错误信息,因为一旦它被抛出,GUI会停顿并冻结一点)。在AWT-EventQueue-0线程中导致NullPointerException的原因

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) 

以下源代码来自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); 

} 

} 
+1

看到您的一些代码可能会有所帮助。 – jjnguy 2009-07-17 13:01:05

+0

添加了我可以的源代码。 – 2009-07-17 13:20:02

回答

1

我在您的堆栈跟踪看到由线限定的削除区域:

SNIP - MY CALL TO PAINT THE LAYER 

该代码调用SunGraphics2D.draw(Shape)。我没有在你编辑过的代码中看到这个调用。但是,它看起来好像你传入的ShapeSunGraphics2D.draw()为空。

0

这意味着,在处理事件(在这种情况下看起来像重绘)时抛出了NullPointerException。这意味着你试图在一个对象上调用一个方法,结果是null。

com.jhlabs.map.layer.Layer类的paintContents()方法中的行70上的某些内容具有null引用。

0

我不知道您在使用哪个IDE,但在Eclipse中,您可以告诉调试器在特定类型的例外情况下中断。 NPE上。

您可以在打开此选项的情况下在Debugmodus中运行您的应用程序,并尝试重现错误,以便您可以检查调试器中出现了什么问题。

0

检查sun lib的源代码是否可用。如果是这样的话:指示你在投放NPE时让debuger保持执行。然后,您可以检查空对象并猜测(或回溯)哪个对象应该在该参考中

相关问题