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:
- eine CannotBorrowException (soll immer auftreten, wenn ein Fehler verhindert, dass ein Artikel geliehen werden kann)
- eine CannotBuyExceotion (wie CannotBorrowException)
- 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
- Noch keine Kommentare vorhanden.
- Dieser Eintrag kann nicht mehr kommentiert werden.
