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.