Zum Menü springen Zum Inhalt springen

iamBlog

Java: Exceptions

21.05 2008 10:14

In der aktuelle Aufgabe sollen wir unser Programm gegen Fehler impfen, die Kunden absichtlich, oder auch unabsichtlich in unserer Videothek verursachen können. Diese sollen wir mit einer geringen Dosis "Exceptions" abfangen und dem lieben Kunden sagen, dass er etwas falsch gemacht hat oder etwas Unerlaubtes mit unserer Videothek treiben wollte.

Im Aufgabenteil A sollen wir uns Gedanken machen, wo überall solche Fehler auftreten können und wie wir diese unterteilen können. Bei Aufgabe B wird das Ganze dann konkret in die Videothek eingebunden und in Aufgabe C getestet.

Wenn wir unser Programm gegen böse Kundeneingaben geimpft haben soll die Ausgabe ungefähr so aussehen: (Wenn sich ein Kunde anmelden will, der nicht im System registriert ist; ein Kunde einen Artikel kaufen mag, den es in der Videothek nicht gibt; ein Kunde einen Artikel leihen mag, den man nur kaufen darf)

videothek.ExistException: Kunde nicht vorhanden (login)
videothek.ExistException: Artikel nicht vorhanden (buyArticle)
videothek.CannotBorrowException: Falscher Artikeltyp (borrowArticle)

Um dies zu erreichen sehen wir uns nun einmal an, was wir in der Aufgabe A alles tun müssen.

Aufgabe A - Fehler (er)finden

In der Angabe heißt es, dass alle Fehler, die wir gleich (er)finden werden, von einer Klasse namens VideothekException abgeleitet werden sollen.

Klasse VideothekException:


abstract class VideothekException extends Exception {
    public VideothekException() {
    }

    public VideothekException(String message) {
        super(message);
    }
}

Wie man sehen kann lässt sich diese Klasse sehr schnell abhaken.

Nun zu dem vermeindlich schwereren Teil:

Fehler (er)finden.

Zuerst sollte man seinen Code durchforsten und mögliche Fehlerquellen ausfindig machen. Allerdings nur für die Klassen, die für den Kunden wichtig sind. => Videothek => Kundensession

Also alle Methoden, die in den Interfaces aufgelistet sind, über die der Kunde kommuniziert:


public interface KundenLogin {
    KundenSicht login(String kundenNr);
}

und


public interface KundenSicht{
    void listArticle();
    void buyArticle(String artikelNummer);
    void borrowArticle(String artikelNummer);
    void logOff();
}

Nun dürft ihr tolle Namen für eure gefundenen Fehler erfinden.

Ich habe aus diesen Methoden 3 verschiedene Fehler gefiltert und so gegliedert:

  1. eine CannotBorrowException (soll immer auftreten, wenn ein Fehler verhindert, dass ein Artikel geliehen werden kann)
  2. eine CannotBuyExceotion (wie CannotBorrowException)
  3. eine ExistException (wie NullPointerException)

public class CannotBorrowException extends VideothekException{
    public CannotBorrowException() {
    }

    public CannotBorrowException(String message) {
        super(message);
    }
}

public class CannotBuyException extends VideothekException{
    public CannotBuyException() {
    }

    public CannotBuyException(String message) {
        super(message);
    }
}

public class ExistException extends VideothekException{
    public ExistException() {
    }

    public ExistException(String message) {
        super(message);
    }
}

Dies war auch schon Aufgabe A - nun weiter zu B.

Aufgabe B - Exceptions anwenden

Da wir nun unser Grundgerüst gegen Fehler haben, werden wir es nun auch anwenden.

So sieht die Methode borrowArticle(in der Klasse KundenSession) vor den Exceptions aus:


    public void borrowArticle(String artikelNummer) {
        if(video != null){
            printSrc();
            video.borrowArticle(artikelNummer);
        } else {
            printErr();
        }
    }

und so danach:


    public void borrowArticle(String artikelNummer) {
        try{
            printSrc("borrowArticle");
            video.borrowArticle(artikelNummer);
        } catch(CannotBorrowException e) {
            System.out.println(e.toString() + " (borrowArticle)");
        } catch(ExistException e) {
            System.out.println(e.toString() + " (borrowArticle)");
        }
    }

(buyArticle, listArticle, login, logOff - aus der Ebene UserInterface - funktionieren analog)

Dass dieser Code oben auch richtig ist müssen wir zuerst die Methode borrowArticle in der Klasse Videothek anpassen.

Die Methode borrowArticle:


    public void borrowArticle (String articleNr ) throws CannotBorrowException, ExistException
    {
        Artikel tmp = findArticle(articleNr);
        if(tmp != null)
        {
            if(!(tmp instanceof SWEET))
            {
                if(tmp.getAvailableArticles() > 0)
                {
                    tmp.decrementArticle();
                } else {
                    throw new CannotBorrowException("Zu wenige Artikel vorhanden");
                }
            } else {
                throw new CannotBorrowException("Falscher Artikeltyp");
            }
        } else {
            throw new ExistException("Artikel nicht vorhanden");
        }
    }

Dies soll natürlich auch mit restlichen Methoden (der Ebene BusinessLogic) gemacht werden...

buyArticle aus der Klasse Videothek:


    public void buyArticle(String articleNr ) throws CannotBuyException, ExistException
    {
        Artikel tmp = findArticle(articleNr);
        if(tmp != null)
        {
            if(tmp instanceof SWEET)
            {
                if(tmp.getAvailableArticles() > 0)
                {
                    tmp.decrementArticle();
                } else {
                    throw new CannotBuyException("Zu wenige Artikel vorhanden");
                }
            } else {
                throw new CannotBuyException("Falscher Artikeltyp");
            }
        } else {
            throw new ExistException("Artikel nicht vorhanden");
        }
    }

Die Methode printSrc aus der Klasse KundenSession:


    public void printSrc(String str) throws ExistException{
        if(kunde == null) throw new ExistException("Kunde nicht registriert");
        
        String ret = "! Action requested by: ";
        if(kunde instanceof FirmenKunde){
            FirmenKunde tmp = (FirmenKunde) kunde;
            ret += tmp.getName();
        } else if (kunde instanceof PrivatKunde){
            PrivatKunde tmp = (PrivatKunde) kunde;
            ret += tmp.getName();
        }
        ret += (" | " + kunde.getKundenNr());
        ret += " (" + str + ")";
        System.out.println(ret);
    }

Die Methode findKunde aus der Klasse Videothek:


    public Kunde findKunde(String kundenNr) throws ExistException{
        Kunde ret = null;
        for(int c = 0; c < kundenListe.getLength(); c++){
            if(((Kunde) kundenListe.get(c)).getKundenNr().equalsIgnoreCase(kundenNr)){
                ret = (Kunde) kundenListe.get(c);
                break;
            }
        }
        if(ret == null) throw new ExistException("Kunde nicht vorhanden");
        return ret;
    }

=> wegen login aus der Klasse Videothek:


    public KundenSicht login(String kundenNr){
        KundenSicht ret = null;
        Kunde kunde     = null;
        try {
            kunde = findKunde(kundenNr);
        } catch (ExistException e) {
            System.out.println(e.toString() + " (login)");
        }
        KundenSicht ks = new KundenSession(kunde, this);
        ret = ks;
        return ret;
    }

Aufgabe C - time to test

So jetzt testen wir das Ganze mal ;)


public class Testsuite {
    public static void main(String[] args){
        
        Videothek video = new Videothek();

        Zeitgeber fatherTime = Zeitgeber.getInstance();
        fatherTime.setZeitfortschritt(1);
        
        Timer timer  = new Timer();
        timer.scheduleAtFixedRate( fatherTime , 1000, 100);
        
        /***************************************
         *   Kundenerstellung
         ***************************************/
        PrivatKunde Kunde1 = new PrivatKunde("Franz", "Huber");     
        FirmenKunde Kunde2 = new FirmenKunde("Google" , "Corporation");
        
        /***************************************
         *    Artikelerstellung
         ***************************************/
        CD article1 = new CD("Pink Floyd","Pink Floyd, Another Brick in the Wall", 2);
        DVD article2 = new DVD("Dinofilm","In Einem Land vor unserer Zeit", 5, 0);
        SWEET article3 = new SWEET("Kaugummi","BUBBLEGUM", 20, "5Tage");

        /***************************************
         *    Administrator Test
         ***************************************/
        AdministrationsSicht admin = video;
        
        admin.addArticle(article1);
//      admin.addArticle(article2);                            // <- Kaugummi wird vernichtet :P 
        admin.addArticle(article3);
        
//      admin.addKunde(Kunde1);                            // <- registrierung von Kunde1 aufgehoben
        admin.addKunde(Kunde2);
        
        /***************************************
         *    Fehler Test
         ***************************************/
        KundenLogin videothek   = video;
        KundenSicht kSicht;

        kSicht = videothek.login(Kunde1.getKundenNr());    // <- Kunde1 wurde nicht am System registriert
        kSicht = videothek.login(Kunde2.getKundenNr());    // <- Kunde2 wurde registriert

        kSicht.borrowArticle(article3.getArtikelNummer()); // <- Fehler - Kaugummi darf man nicht leihen
        kSicht.buyArticle(article2.getArtikelNummer());    // <- Fehler - Kaugummi darf man kaufen - aber nur wenn er existiert
        kSicht.logOff();
    }
}

wenn in der Konsole ungefähr folgendes zu finden ist...

videothek.ExistException: Kunde nicht vorhanden (login)
! Action requested by: Google | Goog6444751014(login)
! Action requested by: Google | Goog6444751014 (borrowArticle)
videothek.CannotBorrowException: Falscher Artikeltyp (borrowArticle)
! Action requested by: Google | Goog6444751014 (buyArticle)
videothek.ExistException: Artikel nicht vorhanden (buyArticle)
! Action requested by: Google | Goog6444751014 (logOff)

kann man sich freuen, denn das Programm funktioniert ;)

Kommentare

  1. Noch keine Kommentare vorhanden.
  2. Dieser Eintrag kann nicht mehr kommentiert werden.

Nächster Eintrag: Der neue Open Movie: Big Buck Bunny

Vorheriger Eintrag: iam Boot Screen für WinXP

Über den iamBlog

Der iamBlog ist von und für Studenten der FH Augsburg und alle Leute die sich für Design, Medien und Multimedia interessieren.

Namensgebend war der Studiengang InterAktive Medien an der FH Augsburg.

Der Blog befindet sich Moment noch im Aufbau. Wir entschuldigen uns für eventuell fehlende Funktionen und den ein oder anderen Fehler im System.

Die neuesten Links

Kategorien

Das neueste Design

Avant von pichfl

Zum Auswählen eines Designs einfach oben links auf den Button Hintergrund ändern klicken.

Feeds

Die Einträge im Blog lassen sich als Atom-Feed abonnieren. Außerdem gibt es einen kombinierten Atom-Feed, der Blogeinträge und Links enthält.
Diese Feeds werden z.B. von Browsern wie Safari oder Mozilla Firefox, Newsreadern wie NetNewsWire oder Feadreader oder Onlinediensten wie Google Reader unterstützt und werden automatisch aktualisiert, wenn neue Einträge im iamBlog vorhanden sind.

Werbung

Disclaimer

This page will never work with Internet Explorer. If you use Internet Explorer to view this page, all styles and features are deactivated. Use Firefox, Safari or Opera to see all the beautiful colours of the internet.