Что вызывает исключение NullPointerException в потоке AWT-EventQueue-0

StackOverflow https://stackoverflow.com/questions/1143099

Вопрос

Я пытаюсь что-то сделать, чтобы отследить проблему, но мало что могу сделать, пока не выполню 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);
    }
}

Слой.краска:

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

Слой.paintLayers:

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

Глобус.краска:

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() нулевой.

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top