Universität Innsbruck Institut für Informatik Datenbanken und Informationssysteme Eva Zangerle 2015/06/18 Programmiermethodik Klausurbeispiele- Lösungsvorschlag Name: Matrikelnr: Prüfungsantritt: Note: Aufgabe mögliche Punkte 1 16 2 18 Total 34 erreichte Punkte Programmiermethodik – Klausurbeispiele 2 Programmiermethodik – Klausurbeispiele Aufgabe 1 (Java-Grundlagen) 16 Punkte a) Gegeben sei die folgende Methodensignatur: 1 public static int computeAverage(List<Integer> inputList) Implementieren Sie diese Methode basierend auf einer java.util.List, wobei der Durchschnitt aller in der Liste enthaltenen Werte berechnet werden soll. Achten Sie dabei auch auf die Möglichkeit leerer Listen und reagieren Sie entsprechend (IllegalArgumentException). Einen Ausschnitt aus der Dokumentation zum java.util.List-Interface finden Sie im Anhang in Abbildung ??. (6 Punkte) Lösung: 1 import java.util.List; 2 3 public int computeAverage(List<Integer> inputList) { if (inputList.size() == 0) { 4 throw new IllegalArgumentException(); 5 6 } 7 return sumList(inputList) / inputList.size(); 8 } 9 10 private int sumList(List<Integer> inputList){ 11 int sum = 0; 12 for (Integer integer : inputList) { sum+=integer; 13 14 } 15 return sum; 16 } b) Betrachten Sie nochmals Ihre Implementierung aus Teilaufgabe 1a. Verfassen Sie zur computeAverage-Methode einen sinnvollen JUnit-Test im folgenden Template. (3 Punkte) @Test 3 Programmiermethodik – Klausurbeispiele public void testListAverage(){ } Lösung: 1 public class AverageableListTest { 2 3 @Test 4 public void testComputeAverage1() { 5 LinkedList<Integer> test = new LinkedList<Integer>(); 6 test.add(3); 7 test.add(6); 8 test.add(9); 9 assertEquals(6, AverageableList.computeAverage(test)); 10 } 11 12 @Test 13 public void testComputeAverage2(){ 14 LinkedList<Integer> test = new LinkedList<Integer>(); 15 test.add(1); 16 assertEquals(1, AverageableList.computeAverage(test)); 17 } 18 19 @Test(expected=IllegalArgumentException.class) 20 public void testComputeAverage3(){ 21 LinkedList<Integer> test = new LinkedList<Integer>(); 22 assertEquals(0, AverageableList.computeAverage(test)); 23 } 4 Programmiermethodik – Klausurbeispiele 24 } c) In welchem Zusammenhang steht die Signatur einer Methode mit dem Prinzip des Überladens? (4 Punkte) Lösung: Signatur = Name der Methode + Liste der Typen der formalen Parameter Beim Überladen einer Funktion bleibt der Name der Methode erhalten, die Parameter (Anzahl, Typen) ändern sich hingegen (zur Laufzeit wird dann die Methode passend zu den übergebenen Parametern aufgerufen)). d) Wieso ist es in statischen Methoden nicht möglich, das Schlüsselwort this zu verwenden? (3 Punkte) Lösung: In statischen Methoden ist keine this-Referenz vorhanden, da this ein Zeiger auf das Objekt ist, das bei statischen Methoden nicht vorhanden ist, da diese an die Klasse gebunden sind. 5 Programmiermethodik – Klausurbeispiele Aufgabe 2 (Exceptions) 18 Punkte a) Erklären Sie kurz den Unterschied zwischen System- und Benutzerausnahmen und geben Sie für jede Art ein Beispiel einer Exception an. (2 Punkte) Lösung: Systemausnahmen werden automatische ausgelöst, müssen nicht abgefangen werden (unchecked exceptions; zur Laufzeit). Benutzerausnahmen müssen hingegen abgefangen werden (checked exceptions). b) Vervollständigen Sie den Code der Erzeugung einer InvalidInputFormatExceptionKlasse. Dabei soll der Exception ein String message übergeben werden können, der den aufgetretenen Fehler beschreibt. (3 Punkte) public class InvalidInputFormatException extends _______________ { } Lösung: 1 package Exceptions; 2 3 4 public class InvalidInputFormatException extends Exception { public InvalidInputFormatException(String message){ super(message); 5 6 } 6 Programmiermethodik – Klausurbeispiele 7 public InvalidInputFormatException() { 8 9 } 10 11 } c) In welchen Fällen würden Sie try/catch und in welchen Fällen würden Sie throws verwenden? Führen Sie auch jeweils ein Beispiel an. (3 Punkte) Lösung: Beim try/catch werden die Ausnahmen direkt aufgefangen und auch behandelt. Bei einem throws wird die Ausnahme weitergereicht, bis gecatcht wird (oder Programm bricht ab). Exceptions sollten dort behandelt (try/catch) werden, wo die Behandlung sinnvoll ist (meist wo die Exception aufgetreten ist bzw. dort, wo alle benötigten Informationen zur Behandlung vorhanden sind). Beispiel siehe Musterlösung 2f. d) Was passiert, wenn eine Exception nirgends abgefangen wird? (2 Punkte) Lösung: Das Programm wird abgebrochen, wenn keine Catch-Klausel gefunden wird. e) Betrachten Sie folgenden Code, der eine vorgegebene CSV-Datei einliest und in eine Map speichert. Der Inhalt dieser CSV-Datei kann wie folgt aussehen und besteht stets aus dem Namen einer Person und vier Integer-Werten. 1 Max Mustermann,1,3,6,7 2 Marianne Mustermann,3,58,39,0 In diesem Code fehlt zu großen Teilen das Exception-Handling. Fügen Sie das Handling der Exceptions hinzu und vervollständigen Sie das Programm (entweder direkt im Code oder Sie geben den einzufügenden Code und die Zeilennummer an, in der Sie den Code einfügen möchten). Achten Sie dabei auf folgende Punkte: • Der FileReader kann eine FileNotFoundException werfen. 7 Programmiermethodik – Klausurbeispiele • Die Methode readline() kann eine IOException werfen. • Verwenden Sie die InvalidInputFormatException, falls die EingabeDatei nicht der Vorgabe entspricht. • Eine NumberFormatException kann beim Parsen von String-Werten in numerische Werte auftreten. (8 Punkte) 8 Programmiermethodik – Klausurbeispiele 1 public class CustomFileReader { public static Map<String, List<Integer>> readFile(String filePath, 2 int noOfExpectedFields) { Map<String, List<Integer>> result = new HashMap<String, List< 3 Integer>>(); File file = new File(filePath); 4 5 6 String currentLine = null; 7 String[] items; 8 try(BufferedReader reader = new BufferedReader(new FileReader(file ));) { while((currentLine = reader.readLine()) != null){ 9 10 items = currentLine.split(","); 11 if(items.length != noOfExpectedFields){ 12 13 } 14 List<Integer> values = new LinkedList<Integer>(); 15 for(int i = 1; i < items.length; i++){ values.add(Integer.valueOf(items[i])); 16 17 } 18 result.put(items[0], values); } 19 20 } 21 return result; } 22 23 public static void main(String[] args) { 24 Map<String, List<Integer>> fileContent = readFile("inputCSV.csv", 25 5); System.out.println(fileContent); 26 } 27 28 } 9 Programmiermethodik – Klausurbeispiele Lösung: 1 package Exceptions; 2 3 import java.io.BufferedReader; 4 import java.io.File; 5 import java.io.FileNotFoundException; 6 import java.io.FileReader; 7 import java.io.IOException; 8 import java.io.InputStreamReader; 9 import java.util.HashMap; 10 import java.util.LinkedList; 11 import java.util.List; 12 import java.util.Map; 13 14 15 16 public class CustomFileReader { public static Map<String, List<Integer>> readFile(String filePath, int noOfExpectedFields) throws FileNotFoundException{ 17 Map<String, List<Integer>> result = new HashMap<String, List< Integer>>(); 18 File file = new File(filePath); 19 String currentLine = null; 20 String[] items; 21 try(BufferedReader reader = new BufferedReader(new FileReader( file));) { 22 while((currentLine = reader.readLine()) != null){ 23 items = currentLine.split(","); 24 if(items.length != noOfExpectedFields){ 25 throw new InvalidInputFormatException("CSV-Format not valid 10 Programmiermethodik – Klausurbeispiele "); 26 } 27 List<Integer> values = new LinkedList<Integer>(); 28 for(int i = 1; i < items.length; i++){ values.add(Integer.valueOf(items[i])); 29 30 } 31 result.put(items[0], values); } 32 } catch (IOException | InvalidInputFormatException e) { 33 34 System.out.println("currentLine: " + currentLine ); 35 e.printStackTrace(); } 36 37 38 return result; 39 40 } 41 42 public static void main(String[] args) { 43 try { 44 Map<String, List<Integer>> fileContent = readFile("inputCSV. 45 csv", 5); System.out.println(fileContent); 46 } catch (FileNotFoundException e) { 47 System.out.println("Could not find file, exiting"); 48 } 49 } 50 51 } 11 Programmiermethodik – Klausurbeispiele 12