Problem mit Listen: add()

Joew0815

Bekanntes Mitglied
Hallo!
Ich möchte eine Zahl in eine Liste schreiben. Nun leider meint meine Programmierumgebung Greenfoot den Befehl add() nicht zu kennen, obwohl ich diese Listen-Sache aus einem anderen Programm das ich mal gemacht hab herauskopiert hab (un dort hats funktioniert!)

Java:
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.util.List;  // Verarbeitung von Listen
import java.util.ArrayList;
import java.lang.Math;

/**
 * Write a description of class Starter here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */

public class Starter  extends Actor

{
    /**
     * Act - do whatever the Starter wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     */
    
    int beg = 0;
    int z = 60;
    List<Integer> g = new ArrayList<Integer>();    // Game erstelle Liste
    List<Integer> p = new ArrayList<Integer>();    // Spieler Liste (zum vergleich)
    int c; 
    public void act() 
    {
        Greenfoot.setSpeed(50);
        
       
        if (beg < 2)
        {
            Beginn();
        }
    }    

    public void Beginn() //Wählt zufällig eine Farbe
    {
        int f;

        f = Greenfoot.getRandomNumber (4);

        if ( f == 1 )
        {
            c = 1;
            setRed();
        }

        if ( f == 2 )
        {
            c = 2;
            setBlue();
        }

        if ( f == 3 )
        {
            c = 3;
            setyellow();
        }

        if ( f == 0 )
        {
            c = 0;
            setgreen();
        } 

    }

    public void setRed()
    {  

        Red r = new Red();
        int xPos = 137;
        int yPos = 131;

        this.getWorld().addObject(r, xPos, yPos);
        Greenfoot.delay(z);
        this.getWorld().removeObject(r);
        Greenfoot.delay(5);
        beg = beg + 1;
        g.add(c);
    }

    public void setBlue()
    {   
        Blue b;

        int xPos;
        int yPos;

        xPos = 363;
        yPos = 131;

        b = new Blue();
        this.getWorld().addObject(b, xPos, yPos);
        Greenfoot.delay(z);
        this.getWorld().removeObject(b);
        //Greenfoot.playSound("Blau.mp3");
        Greenfoot.delay(5);
        beg = beg + 1;
        g.add(c);
    }

    public void setyellow()
    {   
        yellow y;

        int xPos;
        int yPos;

        xPos = 138;
        yPos = 366;

        y = new yellow();
        this.getWorld().addObject(y, xPos, yPos);
        //Greenfoot.playSound("Gelb.mp3");
        Greenfoot.delay(z);
        this.getWorld().removeObject(y);
        Greenfoot.delay(5);
        beg = beg + 1;
        g.add(c);
    }

    public void setgreen()
    {   
        green g;

        int xPos;
        int yPos;

        xPos = 362;
        yPos = 368;

        g = new green();
        this.getWorld().addObject(g, xPos, yPos);
        //Greenfoot.playSound("Gruen.mp3");
        Greenfoot.delay(z);
        this.getWorld().removeObject(g);
        Greenfoot.delay(5);
        beg = beg + 1;
        g.add(c);
    }
}


Ausserdem meckert er erst bei der letzen Methode setgreen() ...
Wo is der Fehler?
 
Deine Klasse green (sollte man Groß schreiben) hat keinen Methode add(). Du hast mit der lokalen Variablen die instanzvariable überdeckt, vermutlich unbeabsichtigt.

Wähle für Variablen sprechende Namen. g sagt überhaupt nichts aus.
 
Dein Problem liegt darin, dass du die add-Methode auf einer Variable versuchst aufzurufen, die der Compiler nicht kennt.
Java:
g.add(..)
aufzurufen auf einer überschatteten Variable bringt nichts, vor allem, wenn diese noch nicht einmal richtig bzw überhaupt nicht definiert ist.

Außerdem meckert er in deiner setgreen()-Methode, weil du dort eine Klasse verwendest, die er sehr wahrscheinlich nicht kennt. Die Groß- und Kleinschreibung ist in Java sehr wichtig! Daher macht es auch einen Unterschied zu schreiben: green g und Green g!!!
 
yellow ist ja auch schon klein geschrieben, da meckert er ja auch nicht ...
Ich hab die beiden klassen ausversehen klein betitelt (Red und Blue sind ja groß)

Ausserdem definier ich doch die Variable c, die in die Liste kommen soll doch immer neu ...

Ich verstehs nich ganz
 
Du rufst g.add auf. In der Methode setgreen ist g aber vom typ green, und die hat wohl keine add Methode.
 
[JAVA=126]green g;[/code]

Diese Zeile ist in deiner setgreen()-Methode dein Problem! Hiermit betreibst du Shadowing (Überschatten). Mal davon abgesehen, dass "green" eine Klasse sein soll (falsche Konvention, wenn es der Fall ist), besitzt diese Klasse, sofern definiert und bekannt, keine add-Methode wie es die Liste selbst hat!

Da du es in den anderen Methoden so nicht machst, gehe ich mal davon aus, dass es hier wohl nur ein Tippfehler ist, weshalb ich diese Zeile entfernen würde, womit du kein Shadowing mehr hast und auf die Instanzvariable und nicht auf eine lokale Variable zurückgegriffen wird und die add()-Methode der Liste selbst wieder greift!
 
ahhhhh

Jetzt hab ich endlich den Fehler entdeckt. g ist zweimal definiert (einmal für Green und einmal für die Liste).

Danke 😉
 
Was hältst du davon, das Ganze so zu schreiben:
Java:
	public void Beginn() // Wählt zufällig eine Farbe
	{
		c = Greenfoot.getRandomNumber(4);
		if (c == 1)	setRed();
		if (c == 2)	setBlue();
		if (c == 3)	setyellow();
		if (c == 0)	setgreen();
	}

	public void setRed() 	{ setColor(new Red(), 	137, 131, "Rot.mp3");	}
	public void setBlue() 	{ setColor(new Blue(), 	363, 131, "Blau.mp3");	}
	public void setYellow()	{ setColor(new Yellow(),138, 366, "Gelb.mp3");	}
	public void setGreen() 	{ setColor(new Green(), 362, 368, "Gruen.mp3"); }

	public void setColor(Object col, int xPos, int yPos, String sound) {
		this.getWorld().addObject(col, xPos, yPos);
		// Greenfoot.playSound(sound);
		Greenfoot.delay(z);
		this.getWorld().removeObject(col);
		Greenfoot.delay(5);
		beg = beg + 1;
		g.add(c);
	}

Wenn die die Methoden nicht noch wo anders brauchst, dann schrumpft das Ganze sogar auf:
Java:
	public void Beginn() // Wählt zufällig eine Farbe
	{
		c = Greenfoot.getRandomNumber(4);
		if (c == 1)	setColor(new Red(), 	137, 131, "Rot.mp3");	
		if (c == 2)	setColor(new Blue(), 	363, 131, "Blau.mp3");
		if (c == 3)	setColor(new Yellow(), 	138, 366, "Gelb.mp3");
		if (c == 0)	setColor(new Green(), 	362, 368, "Gruen.mp3");
	}

	public void setColor(Object col, int xPos, int yPos, String sound) {
		this.getWorld().addObject(col, xPos, yPos);
		// Greenfoot.playSound(sound);
		Greenfoot.delay(z);
		this.getWorld().removeObject(col);
		Greenfoot.delay(5);
		beg = beg + 1;
		g.add(c);		// Das willst du ja anscheinend global verwenden, (naja)
	}
Das wäre der Sinn von Programmieren: Strukturen erkennen und nutzen.
Dann passieren deine obigen Fehler auch wesentlich weniger.
 
Zuletzt bearbeitet:

Zurück
Oben