# Fehlermeldung



## mucke (12. Jan 2010)

Hallo ich bekomm ich Zeile 26 immer den fehler:

cannot find symbol
symbol  : method compare(Play.Card,Play.Card)
location: class Play

ind zeile 7:
on-static method game(Play.Player,Play.Player) cannot be referenced from a static context

Hoffe ihr könnt mir weiter helfen


```
class Play
{
    Player player,cpu;
    
    public static void main(String [] args)
    {
            game(player,cpu);
    }
    
    public void game(Player player, Player cpu)
    {
        player = new Player();
        cpu = new Player();
        Deck main= new Deck(32);
        main.mix();
        main.deal(main);
        
        int i=1;
        int a;
        int b;
        while(!player.mainStack.isEmpty() && !cpu.mainStack.isEmpty())
        {
            Card playerCard = player.mainStack.pop();
            Card cpuCard = cpu.mainStack.pop();
            
            boolean vergleich = compare(playerCard, cpuCard);
            
            if (vergleich)
            {
                System.out.println("Spieler hat diesen Zug gewonnen");
                playerCard.print();
                System.out.println("vs");
                cpuCard.print();   
                player.ablageStack.push(playerCard);// Player bekommt karte auf ablagesta
                player.ablageStack.push(cpuCard);
                a++;
            }
            else
            {
                System.out.println("Computer hat diesen Zug gewonnen");
                playerCard.print();
                System.out.println("vs");
                cpuCard.print();
                cpu.ablageStack.push(playerCard);// Player bekommt karte auf ablagesta
                cpu.ablageStack.push(cpuCard);
                b++;
            }
            
            
            
            if(player.mainStack.isEmpty())
            {
                player.mainStack=player.ablageStack;
                player.ablageStack= new Deck(32);
            }
            if(cpu.mainStack.isEmpty())
            {
                cpu.mainStack=cpu.ablageStack;
                cpu.ablageStack= new Deck(32);
            }
            
            if(player.mainStack.isEmpty() && player.ablageStack.isEmpty())
            {
                System.out.println("Computer hat gewonnen");
            }
            if(cpu.mainStack.isEmpty() && cpu.ablageStack.isEmpty())
            {
                System.out.println("Spieler hat gewonnen");
            }
            
            if(i==64)
            {
                if(a>b)
                {
                    System.out.println("Spieler hat gewonnen" +a+ " zu " +b);
                    
                }
                else if(a<b)
                {
                    System.out.println("Computer hat gewonnen" +b+ " zu " +a);
                    
                }
                else
                {
                    System.out.println(" Unentschieden ");
                }
            }
            
            
            System.out.println("Zug " +i);
            i++;
            
            
    }    
}

class Player
{
    public Deck ablageStack = new Deck(32);
    public Deck mainStack = new Deck(32); 
    
    
}

class Deck
{
    public Card[] stack;//array an karte
    private int top=0; 
    
    public Deck(int i) /*Konstrukteroe haben kein Datentyp*/
    {
      stack = new Card[i];  
    }
    
    public void mix()
    {
        for (int i; i<32; i++)
        {
            //Card temp; //legt neue karte an
            int k = ((int)(Math.random()*32));
            Card temp = stack[i]; // kopiert satack i mti allen eigebschafften
            stack[i]= stack[k];  // Carde i nimmt eigenschaften von Karte k an
            stack[k]= temp; //karte k bekommt eigeschaften von k
        }
    }
        
    public void deal(Deck main)
    {
        boolean counter= true;
        
        for(int i=0; i<32; i++)
        {
            if(counter)
            {
                Card playerCard = pop();
                push (new Card(playerCard.getValueInt(), playerCard.getColorInt())); //
                counter = false;
            }
            else
            {
                Card cpuCard = pop();
                push (new Card(cpuCard.getValueInt(), cpuCard.getColorInt())); //
                counter = true;
            }
        }
    }
    
    public void push (Card element)
    {
        stack[top++] = element;
    }
    
    public Card pop()
    {
        return stack[--top];
    }
    
    public boolean isEmpty()
    {
        
        return top==0;    
    }
    public boolean isFull()
    {
        return (top==stack.length);
        
    }
}

class Card
{
    private final String[] VALUE= {"7","8","9","10","B","D","K","A"};
    private final String[] COLOR={"Karo","Herz","Pik","Kreuz"};
    
    private int value= 0;
    private int color= 0;
    
    public Card ( int value, int color)//Konstruktor
    {
        this.value= value;
        this.color= color;
    }
    /*public String getValue()
    {
        return VALUE[value];
    }
    public String getColor()
    {
        return COLOR[color];
    }*/
    
    public int getValueInt()      /*??????*/
    {
        return value;
    }
    public int getColorInt()
    {
        return color;
    }
       
    public boolean compare(Card playerCard, Card cpuCard)
    {
        if (playerCard.getValueInt() > cpuCard.getValueInt())
        {
            return true;
        }
        
        else if (playerCard.getValueInt() < cpuCard.getValueInt())
        {
            return false;
        }
         
        else
        {
            if (playerCard.getColorInt() > cpuCard.getColorInt())
        {
            return true;
        }
        
        else if (playerCard.getColorInt() < cpuCard.getColorInt())
        {
           return false;
        }
      }
    }

        public void print()
        {
            System.out.println(getValueInt()+ " " + getColorInt());
        }
    }
 
}
```


----------



## Gastredner (12. Jan 2010)

Zeile 26: Du musst die Methode compare() auf einem Objekt der Klasse aufrufen, in der die Methode definiert bzw. implementiert worden ist. Konkret: Auf einer Karte.

Zeile 7: Du versuchst aus der statischen Methode main() die nicht-statische Methode game() aufzurufen - entweder legst du dir also ein Objekt der Klasse Play an und rufst darauf die Methode auf, oder du machst die Methode game() ebenfalls statisch.


----------



## mucke (12. Jan 2010)

wenn ich die methode game auch statisch macht, ändert sich nix =(


----------



## mucke (12. Jan 2010)

So jezt motzt der compiler nicht mehr aber wenn ich es ausführen will kommt diese meldung 

java.lang.ArrayIndexOutOfBoundsException: -1
	at Deck.pop(Play.java:164)
	at Deck.deal(Play.java:144)
	at game.<init>(Play.java:27)
	at Play.main(Play.java:9)


```
class Play
{
 
    
    public static void main(String [] args)
    {
     Player player = new Player(); //Player player,cpu; geht nicht, da beide initialisiert werden m¸ssen
     Player cpu = new Player();  //Auﬂerdem m¸ssen sie in der Funktion stehen und d¸rfen nicht in der 
     game Spiel= new game(player,cpu);//Klasse deklariert werden (warum auch immer?)
        
 
        
    }

    
    public static void game(Player player, Player cpu)
    {
        player = new Player();
        cpu = new Player();
        Deck main= new Deck(32);
        main.mix();
        main.deal(main);
        
        int i=1;
        int a=0;
        int b=0;
        while(!player.mainStack.isEmpty() && !cpu.mainStack.isEmpty())
        {
            Card playerCard = player.mainStack.pop();
            Card cpuCard = cpu.mainStack.pop();
            
            boolean vergleich = playerCard.compare(playerCard, cpuCard); // compare muss von einer Karte aufgerufen 
                            // werden, von welcher ist egal
            if (vergleich)
            {
                System.out.println("Spieler hat diesen Zug gewonnen");
                playerCard.print();
                System.out.println("vs");
                cpuCard.print();   
                player.ablageStack.push(playerCard);// Player bekommt karte auf ablagesta
                player.ablageStack.push(cpuCard);
                a++;
            }
            else
            {
                System.out.println("Computer hat diesen Zug gewonnen");
                playerCard.print();
                System.out.println("vs");
                cpuCard.print();
                cpu.ablageStack.push(playerCard);// Player bekommt karte auf ablagesta
                cpu.ablageStack.push(cpuCard);
                b++;
            }
            
            
            
            if(player.mainStack.isEmpty())
            {
                player.mainStack=player.ablageStack;
                player.ablageStack= new Deck(32);
            }
            if(cpu.mainStack.isEmpty())
            {
                cpu.mainStack=cpu.ablageStack;
                cpu.ablageStack= new Deck(32);
            }
            
            if(player.mainStack.isEmpty() && player.ablageStack.isEmpty())
            {
                System.out.println("Computer hat gewonnen");
            }
            if(cpu.mainStack.isEmpty() && cpu.ablageStack.isEmpty())
            {
                System.out.println("Spieler hat gewonnen");
            }
            
            if(i==64)
            {
                if(a>b)
                {
                    System.out.println("Spieler hat gewonnen" +a+ " zu " +b);
                    
                }
                else if(a<b)
                {
                    System.out.println("Computer hat gewonnen" +b+ " zu " +a);
                    
                }
                else
                {
                    System.out.println(" Unentschieden ");
                }
            }
            
            
            System.out.println("Zug " +i);
            i++;
            
            
    }    
}
}
class Player
{
    public Deck ablageStack = new Deck(32);
    public Deck mainStack = new Deck(32); 
    
    
}

class Deck
{
    public Card[] stack;//array an karte
    private int top=0; 
    
    public Deck(int i) //Konstrukteroe haben kein Datentyp
    {
      stack = new Card[i];  
    }
    
    public void mix()
    {
        for (int i=0; i<32; i++)
        {
            //Card temp; //legt neue karte an
            int k = ((int)(Math.random()*32));
            Card temp = stack[i]; // kopiert satack i mti allen eigebschafften
            stack[i]= stack[k];  // Carde i nimmt eigenschaften von Karte k an
            stack[k]= temp; //karte k bekommt eigeschaften von k
        }
    }
        
    public void deal(Deck main)
    {
        boolean counter= true;
        
        for(int i=0; i<32; i++)
        {
            if(counter)
            {
                Card playerCard = pop();
                push (new Card(playerCard.getValueInt(), playerCard.getColorInt())); //
                counter = false;
            }
            else
            {
                Card cpuCard = pop();
                push (new Card(cpuCard.getValueInt(), cpuCard.getColorInt())); //
                counter = true;
            }
        }
    }
    
    public void push (Card element)
    {
        stack[top++] = element;
    }
    
    public Card pop()
    {
        return stack[--top];
    }
    
    public boolean isEmpty()
    {
        
        return top==0;    
    }
    public boolean isFull()
    {
        return (top==stack.length);
        
    }
}

class Card
{
    private final String[] VALUE= {"7","8","9","10","B","D","K","A"};
    private final String[] COLOR={"Karo","Herz","Pik","Kreuz"};
    
    private int value= 0;
    private int color= 0;
    
    public Card ( int value, int color)//Konstruktor
    {
        this.value= value;
        this.color= color;
    }
    /*public String getValue()
    {
        return VALUE[value];
    }
    public String getColor()
    {
        return COLOR[color];ß
    }*/
    
    public int getValueInt()      //??????
    {
        return value;
    }
    public int getColorInt()
    {
        return color;
    }
       
    public boolean compare(Card playerCard, Card cpuCard)
    {
        if (playerCard.getValueInt() > cpuCard.getValueInt())
        {
            return true;
        }
        
        else if (playerCard.getValueInt() < cpuCard.getValueInt())
        {
            return false;
        }
         
        else
        {
            if (playerCard.getColorInt() > cpuCard.getColorInt())
        {
            return true;
        }
        
        else if (playerCard.getColorInt() < cpuCard.getColorInt())
        {
           return false;
        }
        else
        {
         return false; //hab mal noch ein return eingebaut, damit in jedem Fall 
        }      //was zur¸ckgegeben wird, mein compiler hat sonst gemotzt
      }
    }

        public void print()
        {
            System.out.println(getValueInt()+ " " + getColorInt());
        }
}
```


----------



## Landei (12. Jan 2010)

Du hast einen Stack-Unterlauf, in deal() wird versucht, aus einem leeren Stack zu lesen (Helge Schneider hätte jetzt gesagt: "zu poppen!")


----------



## mucke (13. Jan 2010)

java.lang.NullPointerException
	at game.<init>(Play.java:33)
	at Play.main(Play.java:9)

oke bei den fehlern komm ich nciht mehr weiter =(

```
class Play
{
 
    
    public static void main(String [] args)
    {
     Player player = new Player(); //Player player,cpu; geht nicht, da beide initialisiert werden m¸ssen
     Player cpu = new Player();  //Auﬂerdem m¸ssen sie in der Funktion stehen und d¸rfen nicht in der 
     game(player,cpu);
        
 
        
    }

    
    public static void game(Player player, Player cpu)
    {
        player = new Player();
        cpu = new Player();
        Deck main= new Deck(32);
        main.mix();
        main.deal(main);
        
        
        int i=1;
        int a=0;
        int b=0;
        while(!player.mainStack.isEmpty() && !cpu.mainStack.isEmpty())
        {
            Card playerCard = player.mainStack.pop();
            Card cpuCard = cpu.mainStack.pop();
            
            boolean vergleich = playerCard.compare(playerCard, cpuCard); // compare muss von einer Karte aufgerufen 
                            // werden, von welcher ist egal
            if (vergleich)
            {
                
                playerCard.print();
                System.out.println("vs");
                cpuCard.print(); 
                System.out.println("Spieler hat diesen Zug gewonnen");
                player.ablageStack.push(playerCard);// Player bekommt karte auf ablagesta
                player.ablageStack.push(cpuCard);
                a++;
            }
            else
            {
                
                playerCard.print();
                System.out.println("vs");
                cpuCard.print();
                System.out.println("Computer hat diesen Zug gewonnen");
                cpu.ablageStack.push(playerCard);// Player bekommt karte auf ablagesta
                cpu.ablageStack.push(cpuCard);
                b++;
            }
            
            
            
            if(player.mainStack.isEmpty())
            {
                player.mainStack=player.ablageStack;
                player.ablageStack= new Deck(32);
            }
            if(cpu.mainStack.isEmpty())
            {
                cpu.mainStack=cpu.ablageStack;
                cpu.ablageStack= new Deck(32);
            }
            
            if(player.mainStack.isEmpty() && player.ablageStack.isEmpty())
            {
                System.out.println("Computer hat gewonnen");
            }
            if(cpu.mainStack.isEmpty() && cpu.ablageStack.isEmpty())
            {
                System.out.println("Spieler hat gewonnen");
            }
            
            if(i==64)
            {
                if(a>b)
                {
                    System.out.println("Spieler hat gewonnen" +a+ " zu " +b);
                    
                }
                else if(a<b)
                {
                    System.out.println("Computer hat gewonnen" +b+ " zu " +a);
                    
                }
                else
                {
                    System.out.println(" Unentschieden ");
                }
            }
            
            
            System.out.println("Zug " +i);
            i++;
            
            
    }    
}
}
class Player
{
    public Deck ablageStack = new Deck(32);
    public Deck mainStack = new Deck(32); 
    
    
}

class Deck
{
    public Card[] stack;//array an karte
    private int top=32; 
    
    public Deck(int i) //Konstrukteroe haben kein Datentyp
    {
      stack = new Card[i];  
    }
    
    public void mix()
    {
        for (int i=0; i<32; i++)
        {
            //Card temp; //legt neue karte an
            int k = ((int)(Math.random()*32));
            Card temp = stack[i]; // kopiert satack i mti allen eigebschafften
            stack[i]= stack[k];  // Carde i nimmt eigenschaften von Karte k an
            stack[k]= temp; //karte k bekommt eigeschaften von k
        }
    }
        
    public void deal(Deck main)
    {
        boolean counter= true;
        
        for(int i=1; i<33; i++)
        {
            if(counter)
            {
                Card playerCard = main.pop();  //Du hast einen Stack-Unterlauf, in deal() wird versucht, aus einem leeren Stack zu lesen (Helge Schneider hätte jetzt gesagt: "zu poppen!")
                push (playerCard); //
                counter = false;
            }
            else
            {
                Card cpuCard = main.pop();
                push (cpuCard); //
                counter = true;
            }
        }
    }
    
    public void push (Card element)
    {
        stack[top++] = element;
    }
    
    public Card pop()
    {
        return stack[--top];
    }
    
    public boolean isEmpty()
    {
        
        return top==0;    
    }
    public boolean isFull()
    {
        return (top==stack.length);
        
    }
}

class Card
{
    private final String[] VALUE= {"7","8","9","10","B","D","K","A"};
    private final String[] COLOR={"Karo","Herz","Pik","Kreuz"};
    
    private int value= 0;
    private int color= 0;
    
    public Card ( int value, int color)//Konstruktor
    {
        this.value= value;
        this.color= color;
    }
    /*public String getValue()
    {
        return VALUE[value];
    }
    public String getColor()
    {
        return COLOR[color];ß
    }*/
    
    public int getValueInt()      //??????
    {
        return value;
    }
    public int getColorInt()
    {
        return color;
    }
       
    public boolean compare(Card playerCard, Card cpuCard)
    {
        if (playerCard.getValueInt() > cpuCard.getValueInt())
        {
            return true;
        }
        
        else if (playerCard.getValueInt() < cpuCard.getValueInt())
        {
            return false;
        }
         
        else
        {
            if (playerCard.getColorInt() > cpuCard.getColorInt())
        {
            return true;
        }
        
        else if (playerCard.getColorInt() < cpuCard.getColorInt())
        {
           return false;
        }
        else
        {
         return false; //hab mal noch ein return eingebaut, damit in jedem Fall 
        }      //was zur¸ckgegeben wird, mein compiler hat sonst gemotzt
      }
    }

    public void print()
    {
        System.out.println(getValueInt()+ " " + getColorInt());
    }
}
```


----------



## SlaterB (13. Jan 2010)

die Fehlermeldung besagt, dass im Konstruktor der nicht geposteten Klasse game in Zeile 37 ein Zugriff auf ein null-Objekt stattfindet

vielleicht willst du eher die statische Methode
> public static void game(Player player, Player cpu)
aufrufen?

was bedeutet der Kommentar
//Klasse deklariert werden (warum auch immer?)
?

solange du nicht verstehst, was der Code machen soll, kann es natürlich nicht viel werden,
erst ein Konzept, dann ein Programm


----------



## mucke (13. Jan 2010)

Sry habs geändert, hatte vorher game in ne extra Klasse. Hatte es vergessen heir auszubessern. Der fehler ist in Zeile 33.


----------



## SlaterB (13. Jan 2010)

die Exception kommt, weil in einem Stack nichts drin ist,
beim Stack (Deck) fällt mir auf, dass der mit top=32 beginnt, obwohl er doch anfangs leer ist,
setzt man top auf 0 kracht es woanders, wo pop() aufgerufen wird ohne auf isEmpty() zu prüfen, 

da hat dir sogar jemand anders schon einen Kommentar hingeschrieben:
// Du hast einen Stack-Unterlauf, in deal()
                // wird versucht, aus einem leeren Stack zu
                // lesen (Helge Schneider hätte jetzt
                // gesagt: "zu poppen!")

fang doch mal ganz einfach mit einem leeren Programm an und füge dann Zeile für Zeile hinzu,
zuerst einfache Dinge wie ein Kartendeck aufbauen, wieder leeren usw.
nicht ein ganzes Spiel mit verschiedenen Spielern, mehreren Decks aufeinmal starten und dann gar nicht mehr wissen, wo man ist bei all den Fehlern


----------

