You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Greenfoot提示代码存在错误但无报错标识问题求助

Greenfoot无具体报错提示的代码问题排查

Greenfoot错误提示

我使用Greenfoot开发Java程序时,软件提示代码存在错误,但未给出任何具体报错指示,因此排除语法问题。我尝试调整括号、重启Greenfoot,均无法解决问题。我正在开发一个简单程序,实现Rover移动,在所处位置有岩石时收集岩石,无岩石时放置标记的功能。

以下是代码:

import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

public class Rover extends Actor
{
    private Display anzeige;

    /**
     * Die Anweisungen der Methode act werden ausgeführt, wenn der Act-Button
     * im Hauptfenster geklickt wird.
     */
    public void act() 
    {
        while (!huegelVorhanden("vorne"))
        {
            fahre();
            if (gesteinVorhanden())
                nimmGestein();
                
            markeVorhanden();
        }
    } 

    /**
     * Der Rover bewegt sich ein Feld in Fahrtrichtung weiter.
     * Sollte sich in Fahrtrichtung ein Objekt der Klasse Huegel befinden oder er sich an der Grenze der Welt befinden,
     * dann erscheint eine entsprechende Meldung auf dem Display.
     */
    public void fahre()
    {
        int posX = getX();
        int posY = getY();

        if (huegelVorhanden("vorne"))
        {
            nachricht("Zu steil!");
        }
        else if (getRotation() == 270 && getY() == 1)
        {
            nachricht("Ich kann mich nicht bewegen");
        }
        else
        {
            move(1);
            Greenfoot.delay(1);
        }

        if (posX == getX() && posY == getY() && !huegelVorhanden("vorne"))
        {
            nachricht("Ich kann mich nicht bewegen");
        }
    }

    /**
     * Der Rover dreht sich um 90 Grad in die Richtung, die mit richtung („links“ oder „rechts“) übergeben wurde.
     * Sollte ein anderer Text (String) als "rechts" oder "links" übergeben werden, dann erscheint eine entsprechende Meldung auf dem Display.
     */
    public void drehe(String richtung)
    {
        if (richtung == "rechts")
        {
            turn(90);
            //setRotation(getRotation()+90);
        }
        else if (richtung == "links")
        {
            turn(-90);
            // setRotation(getRotation()-90);
        }
        else
        {
            nachricht("Befehl nicht korrekt!");
        }
    }

    /**
     * Der Rover gibt durch einen Wahrheitswert (true oder false )zurück, ob sich auf seiner 
     * Position ein Objekt der Klasse Gestein befindet.
     * Eine entsprechende Meldung erscheint auch auf dem Display.
     */
    public boolean gesteinVorhanden()
    {
        if (getOneIntersectingObject(Gestein.class) != null)
        {
            nachricht("Gestein gefunden!");
            return true;
        }

        nachricht("Kein Gestein vorhanden!");
        return false;
    }

    public void bergSeiteAbfahren()
    { 
        while (huegelVorhanden("rechts"))
        {
            fahre();
        }
    }

    public void steineSammeln()
    {
        fahren();
            
        while (gesteinVorhanden())
        {
            nimmGestein();
            fahren();
        }
        setzeMarke();
    }  

    /**
     * Der Rover überprüft, ob sich in richtung ("rechts", "links", oder "vorne") ein Objekt der Klasse Huegel befindet.
     * Das Ergebnis wird auf dem Display angezeigt.
     * Sollte ein anderer Text (String) als "rechts", "links" oder "vorne" übergeben werden, dann erscheint eine entsprechende Meldung auf dem Display.
     */
    public boolean huegelVorhanden(String richtung)
    {
        int rot = getRotation();

        if (richtung == "vorne" && rot == 0 || richtung == "rechts" && rot == 270 || richtung == "links" && rot == 90)
        {
            if (getOneObjectAtOffset(1, 0, Huegel.class) != null)
            {
                return true;
            }
        }

        if (richtung == "vorne" && rot == 180 || richtung == "rechts" && rot == 90 || richtung == "links" && rot == 270)
        {
            if (getOneObjectAtOffset(-1, 0, Huegel.class) != null)
            {
                return true;
            }
        }

        if (richtung == "vorne" && rot == 90 || richtung == "rechts" && rot == 0 || richtung == "links" && rot == 180)
        {
            if (getOneObjectAtOffset(0, 1, Huegel.class) != null)
            {
                return true;
            }
        }

        if (richtung == "vorne" && rot == 270 || richtung == "rechts" && rot == 180 || richtung == "links" && rot == 0)
        {
            if (getOneObjectAtOffset(0, -1, Huegel.class) != null)
            {
                return true;
            }
        }

        if (richtung != "vorne" && richtung != "links" && richtung != "rechts")
        {
            nachricht("Befehl nicht korrekt!");
        }

        return false;
    }

    /**
     * Der Rover nimmt das Gestein auf seiner Position auf.
     * Sollte kein Objekt der Klasse Gestein vorhanden sein, dann erscheint
     * eine entsprechende Meldung auf dem Display.
     */
    public void nimmGestein()
    {
        if (gesteinVorhanden())
        {
            Greenfoot.delay(1);
            removeTouching(Gestein.class);
        }
        else 
        {
            nachricht("Hier ist kein Gestein");
        }
    }

    /**
     * Der Rover erzeugt ein Objekt der Klasse „Marke“ auf seiner Position.
     */
    public void setzeMarke()
    {
        getWorld().addObject(new Marke(), getX(), getY());
    }

    /**
     * *Der Rover gibt durch einen Wahrheitswert (true oder false )zurück,
     * *ob sich auf seiner Position ein Objekt der Marke befindet.
     * Eine entsprechende Meldung erscheint auch auf dem Display.
     */
    public boolean markeVorhanden()
    {
        if (getOneIntersectingObject(Marke.class) != null)
        {
            nachricht("Beep Boop");
            return true;
        }

        nachricht("Keine Marke vorhanden!");
        return false;
    }

    public void entferneMarke()
    {
        if (markeVorhanden())
        {
            removeTouching(Marke.class);
        }
    }

    private void nachricht(String pText)
    {
        if (anzeige != null)
        {
            anzeige.anzeigen(pText);
            Greenfoot.delay(1);
            anzeige.loeschen();
        }
    }

    private void displayAusschalten()
    {
        getWorld().removeObject(anzeige);
    }

    protected void addedToWorld(World world)
    {
        setImage("images/rover.png");
        world = getWorld();
        anzeige = new Display();
        anzeige.setImage("images/nachricht.png");
        world.addObject(anzeige, 7, 0);
        if (getY() == 0)
        {
            setLocation(getX(), 1);
        }
        anzeige.anzeigen("Ich bin bereit");
    }

    class Display extends Actor
    {
        GreenfootImage bild; 

        public Display()
        {
            bild = getImage();
        }

        public void act() 
        {
        }  

        public void anzeigen(String pText)
        {
            loeschen();
            getImage().drawImage(new GreenfootImage(pText, 25, Color.BLACK, new Color(0, 0, 0, 0)), 10, 10);
        }

        public void loeschen()
        {
            getImage().clear();
            setImage("images/nachricht.png");
        }
    }
}

问题排查与修复方案

1. 未定义方法调用错误

steineSammeln()方法中调用了fahren(),但类中仅定义了德语拼写的fahre()方法,直接替换两处fahren()为fahre()即可解决该编译错误。

2. 字符串比较逻辑错误

Java中不能用==比较字符串内容,必须使用equals()方法。代码中drehe()、huegelVorhanden()等方法里的richtung == "vorne"这类写法会导致逻辑异常,甚至触发错误分支。

示例修改:

// 原写法
if (richtung == "rechts")
// 修改后(常量放前面避免空指针)
if ("rechts".equals(richtung))

所有字符串比较的位置都需要做此调整。

3. act()方法死循环阻塞线程

act()是Greenfoot的单次执行方法,每次点击Act按钮执行一次逻辑。你在其中使用while (!huegelVorhanden("vorne"))会导致线程阻塞,程序无响应,引发无明确提示的错误。将while改为if,让每次Act执行一轮逻辑:

public void act() 
{
    if (!huegelVorhanden("vorne"))
    {
        fahre();
        if (gesteinVorhanden())
            nimmGestein();
            
        markeVorhanden();
    }
}

4. 缺失类依赖与导入

  • 确保项目中已正确创建Gestein、Huegel、Marke三个类,无语法错误;
  • Display类的anzeigen()方法使用了Color类,需在文件顶部添加导入:
import java.awt.Color;

完成以上修改后,重新编译运行项目,即可解决无提示错误的问题。

内容的提问来源于stack exchange,提问作者DreamcasterShun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 16:39:51