¿Qué causa una NullPointerException en el AWT-EventQueue-0 hilo
-
16-09-2019 - |
Pregunta
Estoy tratando de hacer algo para localizar el problema, pero no hay mucho que pueda hacer hasta paintContents, y todo lo que hay se ve bien a través de mi depurador, pero voy a doble verificación para asegurarse de que no te pierdas nada . Por lo menos, me gustaría saber cómo manejar silencio éstos (como la captura de ellos y ser capaz de emitir un mensaje de error significativo, ya que una vez que se ha tirado, los tartamudeos GUI y se congela por un momento).
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)
El siguiente código es de la de Java Mapa de proyección Biblioteca .
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);
}
}
Solución
Veo en su pila de rastrear una región ocultan fuera definida por la línea:
SNIP - MY CALL TO PAINT THE LAYER
Ese código llama SunGraphics2D.draw(Shape)
. No veo esa llamada en el código que has editado. Sin embargo, parece que la Shape
que está pasando en SunGraphics2D.draw()
es nulo.
Otros consejos
Esto significa que durante la manipulación de un evento (se parece a una pintura en este caso) una NullPointerException fue arrojado. Eso significa que ha intentado llamar a un método en un objeto, y que resultó ser nulo.
Algo en la línea 70 en las paintContents () de la clase com.jhlabs.map.layer.Layer tiene una referencia nula.
No sé lo que IDE que está utilizando, pero en Eclipse Se nota que el depurador a romperse en specifiv tipos de excepciones, por ejemplo, NPE.
Se puede ejecutar su aplicación en Debugmodus con esta opción activada y trate de reproducir el error, de modo que se puede comprobar en su depurador de lo que está mal.
Comprobar si el código fuente de la lib sol está disponible. Si es así: consignados que Debuger mantener la ejecución cuando se produce un NPE. A continuación, se puede comprobar que el objeto es nulo y adivinar (o dar marcha atrás), que debe ser objeto en esa referencia