何がAWT-EventQueueの-0スレッドでNullPointerExceptionが発生します
-
16-09-2019 - |
質問
私は問題を追跡するために何かをしようとしているが、はるかにありません、私はpaintContentsまで行うことができ、すべてが私のデバッガを通じて良いそこに見えますが、私は何かを逃さなかったことを確認するために二重チェックだろうよ。少なくとも、私は黙って(例えば、それらをキャッチし、それがスローされます後から意味のあるエラーメッセージ、ビットのためのGUIの吃音とフリーズを出力することが可能であるとして)これらを処理する方法を知っていただきたいと思います。
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の地図投影ライブラリでからです。
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);
}
}
解決
私はあなたのスタック内の参照行で定義された打ち抜き地域をトレースます:
SNIP - MY CALL TO PAINT THE LAYER
このコードはSunGraphics2D.draw(Shape)
を呼び出します。私はあなたが編集したコードにその呼び出しを参照してくださいいけない。あなたはShape
に渡しているSunGraphics2D.draw()
がnullであるかのようにしかし、それが見えます。
他のヒント
これは、イベントを処理しながら、(この場合は再描画のように見える)にNullPointerExceptionがスローされたことを意味します。それはあなたがオブジェクトのメソッドを呼び出すために試みたが、それがnullであることが判明したことを意味する。
com.jhlabs.map.layer.LayerクラスのpaintContentsにおけるライン70上の何か()メソッドがnull参照を有している。
例えば、私はあなたが使用しているIDEか知りませんが、Eclipseで、あなたは、例外のspecifivタイプで分割するデバッガを伝えることができますNPEます。
は、このオプションをオンにDebugmodusでアプリを実行して、あなたは間違っているものをお使いのデバッガで確認することができるようにエラーを再現しようとすることができます。
太陽のlibのソースコードが入手可能かどうかを確認します。もしそうなら:あなたはNPEがスローされたときに実行を保持するためにdebuger指示します。そして、あなたがその参照にする必要がありますどのオブジェクトnullのオブジェクトをチェックして、推測(またはバックトラック)することができます。