fakult¨at f¨ur informatik - Sprachen und Beschreibungsstrukturen

Werbung
TECHNISCHE UNIVERSITÄT MÜNCHEN
FAKULTÄT FÜR INFORMATIK
Lehrstuhl für Sprachen und Beschreibungsstrukturen
Einführung in die Informatik I für Ingenieure
Prof. Dr. Helmut Seidl, A. Flexeder, S. Friese, M. Petter
WS 2010/11
Übungsblatt 12
19.01.11
Abgabe: 30.01.11 (vor 12 Uhr)
Aufgabe 12.1 (P) Exceptions verstehen
Betrachten Sie folgenden Ausschnitt aus der Klassenhierarchie von Ausnahmen in Java und
folgende Java–Implementierung der Klasse ExceptionTest:
Exception
IOException
EOFException
FileNotFoundException
import java.io.*;
public class ExceptionTest {
public static void main (String[] args) {
try {
... // Inneres des try-Blockes
}
catch (EOFException e) {
System.out.println("EOFException");
}
catch (IOException e) {
System.out.println("IOException");
}
catch (Exception e) {
System.out.println("Exception");
}
System.out.println("ENDE");
}
}
a) An der durch ...“ gekennzeichneten Stelle im try–Block stehe ein Programmstück,
”
durch das Ausnahmen vom Typ EOFException, IOException oder FileNotFoundException
ausgelöst werden können.
Was wird bei Ausführung der main–Methode ausgegeben, falls dabei im try–Block
i) als erstes eine Ausnahme vom Typ EOFException ausgelöst wird,
ii) als erstes eine Ausnahme vom Typ FileNotFoundException ausgelöst wird, oder
iii) gar keine Ausnahme ausgelöst wird?
b) Was wird bei Ausführung der main–Methode ausgegeben, falls dabei im try–Block als
erste Ausnahme eine Division durch 0 auftritt?
Aufgabe 12.2 (P) Eigene Exceptions implementieren
Ziel dieser Aufgabe ist es einen in einer Datei gespeicherten arithmetischen Ausdruck zu
berechnen. Dabei beschränken wir uns auf arithmetische Ausdrücke in denen lediglich natürliche Zahlen und Addition auftreten. Dazu ist die Klasse DateiLeser vorgegeben, mit
der eine Datei Wort für Wort gelesen werden kann.
• Der Konstruktor DateiLeser(String file) erzeugt ein DateiLeser-Objekt für die
Datei file. Existiert eine solche Datei nicht, so wird eine DateiNichtVorhandenException geworfen.
• Um Wort für Wort lesen zu können, wird die Methode String leseNaechstesWort()
zur Verfügung gestellt. Diese liefert beim i-ten Aufruf das i-te Wort als String zurück.
2
Existiert kein i-tes Wort, so wird null zurückgeliefert.
Wir wollen eine statische Methode int berechneWert(String file) schreiben, die eine
in der Datei file angegebene Addition ausrechnet. Wenn die Datei file zum Beispiel den
Ausdruck
21 + 2 + 19
enthält, soll berechneWert(file) den Wert 42 ausgeben. Gehen Sie bei Ihrer Implementierung folgendermaßen vor:
a) Definieren Sie als erstes die notwendigen Exceptions:
• Definieren Sie die von DateiLeser benötigte DateiNichtVorhandenException.
Diese Exception wird auch bei dem Aufruf berechneWert(file) geworfen, falls
keine Datei mit dem Namen file existiert.
• Definieren Sie eine FalschesFormatException. Diese Exception wird beim Aufruf von berechneWert(file) geworfen, wenn file keine korrekte Addition enthält. Die Exception soll die Information enthalten, beim Lesen des wievielten
Wortes ein Fehler aufgetreten ist. Enthält die übergebene Datei den Ausdruck
“ 12 + x ”, wird “FalschesFormatException: Wort 3” ausgegeben.
b) Definieren Sie die statische Methode int berechneWert(String file) in einer Klasse namens Aufgabe. Achten Sie darauf, an den richtigen Stellen die entsprechenden
Exceptions abzufangen und zu werfen.
Hinweis: Die statische Methode int parseInt(String s) der Klasse Integer liefert den
int-Wert der als String repräsentierten Zahl s zurück. Falls der übergebene String s keinen
int-Wert repräsentiert, wird eine NumberFormatException geworfen.
Aufgabe 12.3 [3 Punkte] (H) Listen mit Exceptions
Ergänzen Sie die Klasse List von der Vorlesungsseite um eine sinnvolle Fehlerbehandlung.
Gehen Sie bei Ihrer Implementierung wie folgt vor:
a) Definieren Sie als erstes eine EndOfListException. Diese Exception soll geworfen werden, wenn (1) auf den Vorgänger des ersten oder (2) auf den Nachfolger des letzten
Elements der Liste zugegriffen wird. Parametrisieren Sie diese Exception so, dass (aussagekräftig) ausgegeben wird, um welchen Fall ((1), (2)) es sich handelt.
b) Ergänzen Sie die Klasse List so, dass die Methoden
•
•
•
•
getNext,
getPrevious,
deleteNext,
deletePrevious,
jeweils die passende Exception werfen.
3
Aufgabe 12.4 [7+1 Punkte] (H) Tabellenkalkulation mit Exceptions
In dieser Aufgabe sollen Sie die Tabellenkalkulation von Blatt 9 (deren Implementierung
wir Ihnen nochmals auf der Vorlesungsseite zur Verfügung stellen) um Fehlerbehandlung
ergänzen. Arithmetische Ausdrücke sollen nun wie folgt erweitert werden:
• Klasse Mult: repräsentiert das Produkt zweier Ausdrücke
• Klasse Div: repräsentiert das Verhältnis zweier Ausdrücke
Exceptions in unserer Tabellenkalkulation sollen durch eine Klassenhierarchie von SpreadsheetExceptions dargestellt werden. Dabei sollen folgende Fehlerarten unterstützen werden:
Arithmetic Exceptions: Diese Exceptionart wird durch Fehler bei der Ausdrucksauswertung ausgelöst und besteht aus:
Division by Zero: Diese Exception wird geworfen, wenn sich der Divisor zu 0 auswertet.
Result not Integer: Diese Exception wird geworfen, wenn die Division ganzzahlig
nicht ohne Rest durchführbar ist.
Reference Exceptions: Diese Exceptionart wird durch Fehler bei der Dereferenzierung
von Zellen ausgelöst und besteht aus:
Reference out of Bounds: Diese Exception wird geworfen, wenn eine Zelle, die sich
ausserhalb der Tabellenbegrenzung befindet, referenziert wird.
Reference Evaluation: Diese Exception wird geworfen, wenn bei der Auswertung
einer Zelle ein Fehler auftritt.
Uninitialized Cell: Diese Exception wird geworfen, wenn festgestellt wird, dass die
Zelle noch keinen Ausdruck enthält.
Circular Reference*: Diese Exception wird geworfen, wenn bei der Auswertung einer Referenz die Referenz selbst ausgewertet werden muß.
a) Ergänzen Sie die Klassenhierarchie zur Repräsentation von arithmetischen Ausdrücken
um Mult und Div.
b) Definieren Sie die oben beschriebene Hierarchie von SpreadsheetExceptions. Achten Sie
darauf, die Fehlerklassen so zu gestalten, dass sinnvolle und detaillierte Metadaten zum
entsprechenden Fehler von der Klasse erfasst und bei der Fehlerbehandlung abgerufen
werden können.
c) Modifizieren Sie die gemeinsame Basisklasse Expr so, dass public abstract int
eval() das Auslösen der verschiedenen Exceptions unterstützt.
d) Modifizieren Sie die Ausdrücke und die Tabelle so, dass die Exceptions sinngemäß und
mit den notwendigen Metadaten ausgelöst werden.
e) Ergänzen Sie die Tabelle um eine toString-Methode, die im Normalfall das korrekt berechnet Ergebnis anzeigt und im Fehlerfall pro fehlerhafter Zelle jeweils eine
aussagekräftige und zutreffende Fehlerbeschreibung anzeigt.
(*) Die Umsetzung der Circular Reference Exception gibt einen Zusatzpunkt.
Herunterladen