Java 我在用处理库实现策略模式时遇到了一个问题

Java 我在用处理库实现策略模式时遇到了一个问题,java,processing,Java,Processing,我为“Java中的面向对象编程”课程做模块6作业。我实现了一个功能,当用户在地震标记上按下鼠标右键时,地图将显示具有类似震级的地震标记 在一个类中实现这个很好。但是当我尝试使用该模式时,我得到一个空指针异常。地震城市地图类如下所示: public class EarthquakeCityMap extends PApplet { // The map protected UnfoldingMap map; // Markers for each earthquake

我为“Java中的面向对象编程”课程做模块6作业。我实现了一个功能,当用户在地震标记上按下鼠标右键时,地图将显示具有类似震级的地震标记

在一个类中实现这个很好。但是当我尝试使用该模式时,我得到一个空指针异常。地震城市地图类如下所示:

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)