# Exceptions selber erstellen



## Countertenor (9. Nov 2011)

Hallo liebe Leute,

Ich muss für die Schule eine eigene Ausnahme entwerfen und programmieren, wir benutzen dazu Greenfoot.
Ich hab mich nun mit dem Thema sehr befasst aber weiss nicht wie man selber sowas erstellen kann.
Zum Projekt. Es handelt sich um eine Giraffe die Bäume und Cactus fressen kann und dieses wird gezählt.

Meine Idee ist es, das wenn Greenfoot ein .png Bild einfügen will, und dieses nicht im Ordner ist, eine Fehler-Meldung kommt, und zusätzlich als 2. Ausnahme statt dieser Fehlermeldung er durch die Ausnahme ein anderes Bild nimmt oder dieses auf dem PC sucht.( Falls das geht) Als Beispiel wollte ich        imageWESTUNTEN = new GreenfootImage("GiraffeWestUnten.png"); nehmen.

und eine 3 Ausnahme würde ich gerne entwerfen, das wenn die Tasten links und oben gleichzeitig gedrückt sind, die Giraffe nicht in eine richtung weiter läuft sondern stehen bleibt.

Hier der Quelltext der Klasse Giraffe


```
/**
 * Write a description of class Giraffe here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class Giraffe extends Animal
{

      private GreenfootImage imageNORD;
      private GreenfootImage imageNORDUNTEN;
      private GreenfootImage imageOST;
      private GreenfootImage imageOSTUNTEN;
      private GreenfootImage imageSUED;
      private GreenfootImage imageSUEDUNTEN;
      private GreenfootImage imageWEST;
      private GreenfootImage imageWESTUNTEN;
      private int TreesEaten;
      private int CactusEaten;
      
      
    /**
     * Act - do whatever the Giraffe wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     */
    public Giraffe()
    {
       imageNORD = new GreenfootImage("GiraffeNord.png");
       imageNORDUNTEN = new GreenfootImage("GiraffeNordUnten.png");
       imageOST = new GreenfootImage("GiraffeOst.png");
       imageOSTUNTEN = new GreenfootImage("GiraffeOstUnten.png");
       imageSUED = new GreenfootImage("GiraffeSued.png");
       imageSUEDUNTEN = new GreenfootImage("GiraffeSuedUnten.png");
       imageWEST = new GreenfootImage("GiraffeWest.png");
       imageWESTUNTEN = new GreenfootImage("GiraffeWestUnten.png");
       TreesEaten = 0;
       CactusEaten = 0;
       
       
    
                 
    }
       
    
    
       public void act() 
    {
        checkKeypress();
        eatGras();
        eatTree();
        System.out.println("Ich hab schon " + TreesEaten + " Trees gefressen!");
        System.out.println("Ich hab schon " + CactusEaten + " Cactus gefressen!");
        
         
        if(CactusEaten==2)
        { 
          ((Level1) getWorld()).gameOver();
        }
   
        
       
    }
    

     
    /**
     * Prüft ob eine Steuertaste auf der Tastatur gedrückt wurde.
     * Wenn ja, reagiert die Methode entsprechend.
     */
        public void checkKeypress()
        {
        if (Greenfoot.isKeyDown("up")) 
        {
            oben();
            setImage(imageNORD);
        }
        
        if (Greenfoot.isKeyDown("right")) 
        {
            rechts();
            setImage(imageOST);
        }
        if (Greenfoot.isKeyDown("down")) 
        {
            unten();
            setImage(imageSUED);
        }
        if (Greenfoot.isKeyDown("left")) 
        {
            links();
            setImage(imageWEST);
        }
        
        /**
         * Die Taste "-" senkt den Kopf nach unten.
         */
        
        if (getImage() == imageNORD && Greenfoot.isKeyDown("-") )
        {
            setImage(imageNORDUNTEN);
            unten();
            }   
        if (getImage() == imageOST && Greenfoot.isKeyDown("-") )
        {
             setImage(imageOSTUNTEN);
             links();
            }
        if (getImage() == imageSUED && Greenfoot.isKeyDown("-") )
        {
            setImage(imageSUEDUNTEN);
            oben();
        }
        if (getImage() == imageWEST && Greenfoot.isKeyDown("-") )
        {
            setImage(imageWESTUNTEN);
            rechts();       
        }
        
        /**
         * Verhindert das die Giraffe quer laufen kann.
         */
        
        if (Greenfoot.isKeyDown("right") && Greenfoot.isKeyDown("down")) 
        {
            links();
        }
        if (Greenfoot.isKeyDown("right") && Greenfoot.isKeyDown("up")) 
        {
            unten();
        }
        if (Greenfoot.isKeyDown("left") && Greenfoot.isKeyDown("down")) 
        {
            oben();
        }
        if (Greenfoot.isKeyDown("left") && Greenfoot.isKeyDown("up")) 
        {
            unten();
        }
              
    }
    
    /**
     * Prüft, ob wir auf ein Cactus getroffen sind, wenn der Kopf unten ist.
     * Wenn ja, wird dieses gefressen. Wenn nein, passiert nichs.
     */
    public void eatGras()
    {
        if ( canSee(Cactus.class)  && Greenfoot.isKeyDown("-"))
        {
            eat(Cactus.class);
            countFood();
            CactusEaten = CactusEaten + 1; 
        }
    }
    
    /**
     * Prüft, ob wir auf einen Tree getroffen sind, wenn der Kopf oben ist.
     * Wenn ja, wird dieser gefresse. Wenn nein, passiert nichs.
     */
    public void eatTree()
    {
        if ( canSee(Tree.class) && !Greenfoot.isKeyDown("-") && Greenfoot.isKeyDown("."))
        {
            eat(Tree.class);
            countFood();
            TreesEaten = TreesEaten + 1; 
        }      
    }
        
        public boolean foundTree()
{
   Actor Tree= getOneIntersectingObject(Tree.class);
   if (Tree != null) 
  {
     return true;
   }
   else 
  {       
     return false;   
   }

   
   
       
}
  


    
 
 
public int getTreesEaten()
{
   return TreesEaten;
 }
 
 public int getCactusEaten()
{
   return CactusEaten;
 }
 
 
public void countFood()
{
    ((Level1) getWorld()).counter.add(1);
}
 
 
 }
```


----------



## nillehammer (9. Nov 2011)

Für behandelte Exceptions (der Programmierer muss sie mit try-catch abfangen oder weiter werfen):
[Java]
public final MeineGiraffenException extends Exception {
 ...
}
[/Java]
Für unbehandelte Exceptions (der Programmierer muss sie nicht mit try-catch abfangen oder weiter werfen):
[Java]
public final MeineGiraffenException extends RuntimeException {
 ...
}
[/Java]


----------



## Countertenor (9. Nov 2011)

Danke für deine antwort....

also das mit unchecked und checked exceptions weiss ich schon, nur stellt sich jetzt meine frage wie ich es in mein code einbau. wo muss ich den try block hin machen und was muss ich reinschreiben damit wenn das bild nicht gefunden wurde eine meldung kommt oder er weiter sucht....

Habs mir in einem Java buch angeguckt und in bestimmt 7 verschiedenen online version aber ich steig da nicht durch.


----------



## Landei (9. Nov 2011)

Exceptions sind nichts besonderes, dass einzige, was man wissen muss, ist dass man in Java nur das "werfen" kann, was Throwable implementiert. Üblicherweise erbt man einfach von Exception oder einer geeigneten Unterklasse (Error, RuntimeException...), wie bei jeder anderen Klasse auch:


```
public class FooException extends Exception {
   public FooException(String message) {
      super(message);
   }
  //eventuell weitere Konstruktoren
}
```

Wenn man will, kann man natürlich auch fehlerspezifische Daten in der Fehlerklasse speichern. 

Details : Galileo Computing :: Java ist auch eine Insel - 6 Exceptions und dabei insbesondere Galileo Computing :: Java ist auch eine Insel - 6 Exceptions


----------



## timbeau (9. Nov 2011)

```
File bild = new File("...");
try {

If(!bild.exists()) 
throw new MeineEigeneSpezielleException(...);

}
catch (MeineEigeneSpezielleException e) {
bild = new File("standartpfad");
}
```

Als Bsp und ungetestet.


----------



## Countertenor (9. Nov 2011)

Hab mir das alles nun angeguckt und versucht zu verstehen aber ich komm immer noch nicht dahint wie ich es bei mir einbau. Muss sagen ich bin echt Anfänger, und bei Greenfoot wird einem ja alles soweit vorgegeben^^

Ich habs jetzt so verstanden das ich eine Klasse erstellen muss, zb, Meine exception.

Aber wo schreib ich den try catch Block hin?

In die Klasse Giraffe, weil die das Bild öffnen soll?


----------



## Landei (9. Nov 2011)

Na da wo der Fehler "passieren" kann:

```
try {
  vorbereiten();
  bankraub(); //das kann schiefgehen, also eine Exception liefern
  beuteVerstecken(); //das würde übersprungen, wenn es schief geht
} catch (ErwischtException ex) {
  //falls es schiefgeht 
  gefängnisAusbruch();
}
//ansonsten geht es gleich hier weiter
```


----------



## Countertenor (9. Nov 2011)

Okay das hab ich verstanden^^

also in try kommt die methode was er machen soll aber schief gehen kann, also hier das bild öffnen, die ist aber nicht da.

So jetzt soll er es dann bei c:\ öffnen.

Nur meint er das im Try blcok keine anweisung gibt die diese hervorrufen kann, also bin ich nun überfragt was ich in try schreiben soll



```
public void main ()
    {
        try
        {
          imageWESTUNTEN = new GreenfootImage("GiraffeWestUnten.png");

        }
        catch (FileNotFoundException e) {
            bild = new File("C:\\GiraffeWestUnten.png");
        }
        
    }
    
}
```


----------



## chalkbag (10. Nov 2011)

Deine Klasse GreenfootImage muss mitteilen, dass sie in der Lage ist eine entsprechende Exception zu werfen. Hierfür würde es reichen im Konstruktor ein throws FileNotFoundException anzuhängen.



```
public GreenfootImage(String filename) throws FileNotFoundException{
....
}
```


Aber wolltest du nicht eigenen Exception werfe, vielleicht hab ich auch was überlesen.


----------



## timbeau (10. Nov 2011)

Siehe mein Beispiel von oben!


----------

