Что вызывает исключение NullPointerException в потоке AWT-EventQueue-0 - PullRequest
2 голосов
/ 17 июля 2009

Я пытаюсь что-то предпринять, чтобы отследить проблему, но я мало что могу сделать, пока paintContents, и все там хорошо выглядит через мой отладчик, но я дважды проверю, чтобы убедиться, что я ничего не пропустил , По крайней мере, я хотел бы знать, как молча обрабатывать их (например, перехватывать их и иметь возможность выводить осмысленное сообщение об ошибке, так как после того, как оно выброшено, графический интерфейс прерывается и останавливается на некоторое время).

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);

}

}

Ответы [ 4 ]

1 голос
/ 17 июля 2009

Я вижу в вашем стеке трассировку заштрихованной области, определяемой линией:

SNIP - MY CALL TO PAINT THE LAYER

Этот код называется SunGraphics2D.draw(Shape). Я не вижу этот вызов в коде, который вы отредактировали. Однако, похоже, что Shape, который вы передаете в SunGraphics2D.draw(), является нулевым.

0 голосов
/ 17 июля 2009

Проверьте, доступен ли исходный код Sun lib. Если это так: поручите отладчику задерживать выполнение, когда выбрасывается NPE. Затем вы можете проверить нулевой объект и угадать (или вернуться), какой объект должен быть в этой ссылке

0 голосов
/ 17 июля 2009

Я не знаю, какую IDE вы используете, но в Eclipse вы можете сказать отладчику прерывать при определенных типах исключений, например, Неработающий.

Вы можете запустить свое приложение в Debugmodus с включенной этой опцией и попытаться воспроизвести ошибку, чтобы вы могли проверить в отладчике, что не так.

0 голосов
/ 17 июля 2009

Это означает, что при обработке события (в данном случае выглядит перекрашиванием) было сгенерировано исключение NullPointerException. Это означает, что вы пытались вызвать метод объекта, и он оказался нулевым.

Что-то в строке 70 в методе paintContents () класса com.jhlabs.map.layer.Layer имеет нулевую ссылку.

...