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
相关产品推荐
相关产品推荐

