Java 我在用处理库实现策略模式时遇到了一个问题
我为“Java中的面向对象编程”课程做模块6作业。我实现了一个功能,当用户在地震标记上按下鼠标右键时,地图将显示具有类似震级的地震标记 在一个类中实现这个很好。但是当我尝试使用该模式时,我得到一个空指针异常。地震城市地图类如下所示:Java 我在用处理库实现策略模式时遇到了一个问题,java,processing,Java,Processing,我为“Java中的面向对象编程”课程做模块6作业。我实现了一个功能,当用户在地震标记上按下鼠标右键时,地图将显示具有类似震级的地震标记 在一个类中实现这个很好。但是当我尝试使用该模式时,我得到一个空指针异常。地震城市地图类如下所示: public class EarthquakeCityMap extends PApplet { // The map protected UnfoldingMap map; // Markers for each earthquake
public class EarthquakeCityMap extends PApplet
{
// The map
protected UnfoldingMap map;
// Markers for each earthquake
protected List<Marker> quakeMarkers;
// NEW IN MODULE 5
protected CommonMarker lastClicked;
private MouseClickBehavior mouse_behavior_;
@Override
public void mouseClicked()
{
if(mouseButton == LEFT) LeftClick();
if(mouseButton == RIGHT) RightClick();
}
private void RightClick()
{
SetClickBehavior(new RightClick());
mouse_behavior_.MouseClick();
}
public void SetClickBehavior(MouseClickBehavior obj_bahavior){ mouse_behavior_ = obj_bahavior; }
}
发生异常的RightClick类是:
public class RightClick implements MouseClickBehavior
{
public RightClick()
{
map_ = new EarthquakeCityMap();
magnitude_ = -2.0f;
begin_ = end_ = 0.0f;
}
@Override
public void MouseClick()
{
CheckEarthquakesForMagnitude();
}
private void CheckEarthquakesForMagnitude()
{
if (map_.lastClicked != null) {
map_.unhideMarkers();
map_.lastClicked = null;
}
else {
for(Marker m : map_.quakeMarkers)
{
EarthquakeMarker marker = (EarthquakeMarker) m;
if (!marker.isHidden() && marker.isInside(map_.map, map_.mouseX, map_.mouseY))
{
magnitude_ = marker.getMagnitude();
map_.lastClicked = marker;
break;
}
}
ShowMagnitudeMarkers();
}
}
private EarthquakeCityMap map_;
private float magnitude_;
}
最后是堆栈跟踪
Exception in thread "Animation Thread" java.lang.NullPointerException
at RightClick.CheckEarthquakesForMagnitude(RightClick.java:25)
at RightClick.MouseClick(RightClick.java:15)
at EarthquakeCityMap.RightClick(EarthquakeCityMap.java:108)
at EarthquakeCityMap.mouseClicked(EarthquakeCityMap.java:102)
at processing.core.PApplet.mouseClicked(PApplet.java:3149)
at processing.core.PApplet.handleMouseEvent(PApplet.java:2842)
at processing.core.PApplet.dequeueEvents(PApplet.java:2729)
at processing.core.PApplet.handleDraw(PApplet.java:2401)
at processing.opengl.PJOGL$PGLListener.display(PJOGL.java:873)
at jogamp.opengl.GLDrawableHelper.displayImpl(GLDrawableHelper.java:690)
at jogamp.opengl.GLDrawableHelper.display(GLDrawableHelper.java:672)
at javax.media.opengl.awt.GLCanvas$10.run(GLCanvas.java:1383)
at jogamp.opengl.GLDrawableHelper.invokeGLImpl(GLDrawableHelper.java:1277)
at jogamp.opengl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:1131)
at javax.media.opengl.awt.GLCanvas$11.run(GLCanvas.java:1394)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:301)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
我只包含了我认为与问题相关的代码。如果有人能向我解释为什么我会出现异常,以及如何在不过度膨胀地震地图的情况下实现该行为,那就太好了
提前谢谢
更新:
谢谢你的评论。我已经对我的代码做了一些修改,但是在这里发布太多了。如果有人对代码感兴趣,我已经创建了回购协议。链接是
在更改代码并调试代码之后,我注意到,当用户右键单击映射时,一个新的RightClick对象被初始化,但在构造函数完成后,他的成员变量map_u被初始化为null。这就是我得到NPE的原因。不知道为什么。非常感谢您的帮助。Stacktrace显示,RightClick.java的第22行出现异常。检查您在该行上使用的变量是否已初始化。此外,请遵守Java命名约定。方法和变量总是以小写字母开头,naver包含下划线。此Java代码不会编译。提供固定的语法代码如果没有一个。我们看不到
SetClickBehavior()
函数,更重要的是,我们看不到初始化任何变量的位置。您的NPE可能是由于缺少初始化而导致的,因此我们需要查看您将它们初始化为什么。
Exception in thread "Animation Thread" java.lang.NullPointerException
at RightClick.CheckEarthquakesForMagnitude(RightClick.java:25)
at RightClick.MouseClick(RightClick.java:15)
at EarthquakeCityMap.RightClick(EarthquakeCityMap.java:108)
at EarthquakeCityMap.mouseClicked(EarthquakeCityMap.java:102)
at processing.core.PApplet.mouseClicked(PApplet.java:3149)
at processing.core.PApplet.handleMouseEvent(PApplet.java:2842)
at processing.core.PApplet.dequeueEvents(PApplet.java:2729)
at processing.core.PApplet.handleDraw(PApplet.java:2401)
at processing.opengl.PJOGL$PGLListener.display(PJOGL.java:873)
at jogamp.opengl.GLDrawableHelper.displayImpl(GLDrawableHelper.java:690)
at jogamp.opengl.GLDrawableHelper.display(GLDrawableHelper.java:672)
at javax.media.opengl.awt.GLCanvas$10.run(GLCanvas.java:1383)
at jogamp.opengl.GLDrawableHelper.invokeGLImpl(GLDrawableHelper.java:1277)
at jogamp.opengl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:1131)
at javax.media.opengl.awt.GLCanvas$11.run(GLCanvas.java:1394)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:301)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)