Universität Bremen Musterlösung: Wortstatistik import importjava.io.*; java.io.*; class classWordsStat WordsStat {{ static staticboolean booleanisWhiteSpace(char isWhiteSpace(charc)c) {{ return returncc== ==' '' '||||cc== =='\t' '\t'||||cc== =='\n' '\n'||||cc== =='\r'; '\r'; }} static staticboolean booleanisPunctuation(char isPunctuation(charc)c) {{ return returncc== =='.''.'||||cc== =='!''!'||||cc== =='?' '?'||||cc== ==':'':'||||cc== ==','','|||| cc== =='"''"'||||cc== =='(''('||||cc== ==')'')'||||cc== ==';'';'||||cc== =='-'; '-'; }} static staticboolean booleanignore(char ignore(charc)c) {{ return returnisWhiteSpace(c) isWhiteSpace(c)||||isPunctuation(c); isPunctuation(c); }} Einführung in die Programmierung mit Java 121 Universität Bremen Musterlösung: Wortstatistik static staticString[] String[]readWords(FileInputStream readWords(FileInputStreamstream,int stream,intc,int c,intindex) index)throws throwsIOException IOException {{ while(c while(c!= !=-1 -1&& &&ignore((char) ignore((char)c)) c)) cc==stream.read(); stream.read(); if(c if(c!= !=-1) -1) {{ String Stringword word==""; ""; while(c != -1 && while(c != -1 &&!ignore((char) !ignore((char)c)) c)) {{ word word+= +=(char) (char)c;c; cc==stream.read(); stream.read(); }} String[] String[]words words==readWords(stream,c,index readWords(stream,c,index++1); 1); words[index] = word.toLowerCase(); words[index] = word.toLowerCase(); return returnwords; words; }} else else return returnnew newString[index];} String[index];} Einführung in die Programmierung mit Java 122 Universität Bremen Musterlösung: Wortstatistik static staticvoid voidcount(String[] count(String[]s)s) {{ int inti i==0;0; while(i while(i<<s.length) s.length) {{ String Stringword word==s[i++]; s[i++]; int num = 1; int num = 1; while(i while(i<<s.length s.length&& && word.equals(s[i++])) word.equals(s[i++])) ++num; ++num; System.out.println(num System.out.println(num++"\t" "\t"++word); word); }} }} static staticvoid voidswap(String[] swap(String[]s,int s,inti,i,int intj)j) {{ String Stringt t==s[i]; s[i];s[i] s[i]==s[j]; s[j];s[j] s[j]==t;t; }} Einführung in die Programmierung mit Java static staticvoid voidsort(String[] sort(String[]s)s) {{ for(int for(inti i==0;0;i i<<s.length-1; s.length-1;++i) ++i) for(int j = i+1; j < s.length; for(int j = i+1; j < s.length;++j) ++j) if(s[j].compareTo(s[i]) < 0) if(s[j].compareTo(s[i]) < 0) swap(s,i,j); swap(s,i,j); }} static staticvoid voidmain(String[] main(String[]args) args)throws throws FileNotFoundException,IOException FileNotFoundException,IOException {{ FileInputStream FileInputStreamstream stream== new newFileInputStream(args[0]); FileInputStream(args[0]); String[] String[]words words== readWords(stream,stream.read(),0); readWords(stream,stream.read(),0); sort(words); sort(words); count(words); count(words); }} }} 123 Universität Bremen Beispiel: Wortstatistik Einführung in die Programmierung mit Java 124 Universität Bremen Ausnahmen (Exceptions) Erzeugen (throw) Fangen (catch) Exceptions dienen zum Mitteilen von Fehlerzuständen An der Stelle, an der die Exception ausgelöst wird, wird die Ausführung des Programms unterbrochen und an anderer Stelle wieder aufgenommen Das Behandeln einer Exception bezeichnet man als fangen Wird eine Exception nicht gefangen, wird das Programm abgebrochen und eine Fehlermeldung ausgegeben Erzwingen der Behandlung Durch die Angabe einer throws-Klausel hinter dem Funktionskopf werden Aufrufer der Funktion gezwungen, die genannte Exception zu behandeln Allerdings kann der Aufrufer ebenfalls eine throws-Klausel hinter seinem Funktionskopf verwenden, um die Behandlung an seinen Aufrufer weiterzuleiten Einführung in die Programmierung mit Java 125 Universität Bremen Ausnahmen: Syntax funktionskopf funktionskopf[ [throws throwsexceptiontyp exceptiontyp{ {, ,exceptiontyp exceptiontyp} }] ] throw thrownew newexceptiontyp exceptiontyp( ([ [ausdruck ausdruck{ {, ,ausdruck ausdruck} }] ]) ); ; try try {{ { {anweisung anweisung} } }} { {catch catch( (exceptiontyp exceptiontypbezeichner bezeichner) ) {{ { {anweisung anweisung} } }}} } [ [finally finally {{ { {anweisung anweisung} } }}] ] Einführung in die Programmierung mit Java 126 Universität Bremen Der Weg einer Ausnahme Parameter Parametervon vonmain(...) main(...) Rücksprungadresse Rücksprungadresse Lokale LokaleVariablen Variablenvon vonmain main try{...} catch(E1 e){...} catch(E2 e){...} finally{...} ... Parameter Parametervon vonfun1(...) fun1(...) Rücksprungadresse Rücksprungadresse Lokale LokaleVariablen Variablenvon vonfun1 fun1 Parameter Parametervon vonfun2(...) fun2(...) try{...} catch(E3 e){...} catch(E4 e){...} finally{...} ... Rücksprungadresse Rücksprungadresse Lokale LokaleVariablen Variablenvon vonfun2 fun2 throw new E1(); Einführung in die Programmierung mit Java 127 Universität Bremen Die Exception-Hierarchie Throwable Throwable Exception Exception sonstige sonstige Error Error RuntimeException RuntimeException ArithmeticException ArithmeticException usw. usw. VirtualMachineError VirtualMachineError IndexOutOf IndexOutOf BoundsException BoundsException ArrayIndexOutOf ArrayIndexOutOf BoundsException BoundsException Einführung in die Programmierung mit Java usw. usw. StringIndexOutOf StringIndexOutOf BoundsException BoundsException 128 Universität Bremen Wortstatistik mit Exception-Handling static staticvoid voidmain(String[] main(String[]args) args) {{ if(args.length if(args.length!= !=1) 1) System.out.println( System.out.println( "usage:\tjava "usage:\tjavaWordsStat WordsStatfile"); file"); else else try try {{ FileInputStream FileInputStreamstream stream== new newFileInputStream(args[0]); FileInputStream(args[0]); String[] String[]words words== readWords(stream,stream.read(),0); readWords(stream,stream.read(),0); sort(words); sort(words); count(words); count(words); }} Einführung in die Programmierung mit Java }} catch(FileNotFoundException catch(FileNotFoundExceptione) e) {{ System.out.println(args[0] System.out.println(args[0]++ ":":no nosuch suchfile fileor ordirectory"); directory"); }} catch(IOException catch(IOExceptione) e) {{ System.out.println(args[0] System.out.println(args[0]++ ":":file fileisiscorrupted"); corrupted"); }} }} 129 Universität Bremen Beispiel: Exception-Handling Einführung in die Programmierung mit Java 130 Universität Bremen BinTree mit Exceptions BinTree BinTreeleft() left()throws throwsException Exception {{ if(empty()) if(empty()) throw thrownew newException("Zugriff Exception("Zugriffauf aufleeren leerenBaum!"); Baum!"); else else return returnleftBranch; leftBranch; }} BinTree BinTreeright() right()throws throwsException Exception {{ :: }} int intvalue() value()throws throwsException Exception {{ if(empty()) if(empty()) throw thrownew newException("Zugriff Exception("Zugriffauf aufleeren leerenBaum!"); Baum!"); else else return returnval; val; }} Einführung in die Programmierung mit Java 131 Universität Bremen BinTree mit Exceptions static staticpublic publicvoid voidmain(String[] main(String[]args) args) {{ try try {{ BinTree BinTreeb1 b1==new newBinTree(); BinTree(); BinTree b2 = new BinTree(); BinTree b2 = new BinTree(); System.out.println(new System.out.println(newBinTree(b1,42,b2).left() BinTree(b1,42,b2).left()== ==b1); b1); :: System.out.println(new System.out.println(newBinTree().left()); BinTree().left()); }} catch(Exception catch(Exceptione) e) {{ System.out.println(e.getMessage()); System.out.println(e.getMessage()); }} }} Einführung in die Programmierung mit Java 132 Universität Bremen Beispiel: BinTree mit Exceptions Einführung in die Programmierung mit Java 133 Universität Bremen Dokumentieren von Quelltexten Klassen Member-Variablen Allgemeine Beschreibung, was die Aufgabe der Klasse ist Was wird in der Variablen gespeichert? Haben bestimmte Belegungen besondere Bedeutungen? Member-Funktionen Was tut die Funktion? Welche Parameter hat sie und was bedeuten sie? Welches Ergebnis liefert die Funktion? Welche Seiteneffekte hat die Funktion? Was sind die Vorbedingungen für die Anwendbarkeit der Funktion? Welche Nachbedingungen sind erfüllt? Einführung in die Programmierung mit Java 134 Universität Bremen Dokumentieren von Quelltexten In externen Dokumenten Kommentare in Java Wie ist die Gesamtarchitektur des Programms? Wie arbeiten die Klassen zusammen? Wie benutzt man das Programm? Zeilen-Kommentar: // Dies ist ein Kommentar bis zum Zeilenende Block-Kommentar: /* Dies ist ein Kommentar bis zur Endmarkierung */ JavaDoc-Kommentar: /** Dies ist ein JavaDoc-Kommentar */ Spezialitäten in JavaDoc-Kommentaren @author Hier steht der Author @version Hier wird die Versionsnummer angegeben @param Hier wird ein Funktionsparameter beschrieben @return Hier wird der Rückgabewert beschrieben @throws Hier wird eine möglicherweise von einer Funktion erzeugte Exception beschrieben Einführung in die Programmierung mit Java 135 Universität Bremen Stack mit JavaDoc-Kommentaren /** /** **The Theclass classStack Stackrealizes realizesan anunlimited unlimited **stack for integer numbers. The stack for integer numbers. Thecurrent current **implementation is based on a linked implementation is based on a linkedlist. list. **@author Thomas R&ouml;fer @author Thomas R&ouml;fer */*/ public publicclass classStack Stack {{ /** /** **The Thelocal localclass classStackElement StackElementrepresents represents **aasingle element on the stack. It single element on the stack. Itconsists consists **ofofthe value to store and a reference the value to store and a referencetoto **the thenext nextelement elementon onthe thestack. stack. */*/ private privateclass classStackElement StackElement {{ StackElement StackElementnext; next; int value; int value; }} Einführung in die Programmierung mit Java /** /** **The Theprivate privatemember memberfirst firstisisaareference reference **totothe first element on the stack. the first element on the stack.IfIfititisis **null, null,the thestack stackisisempty. empty. */*/ private privateStackElement StackElementfirst; first; /** /** **The Theonly onlyconstructor constructorofofthe theclass. class. */*/ public publicStack() Stack() {{ first first==null; null; }} /** /** **The Thefunction functionputs putsaanumber numberon ontop topofof **the thestack. stack. **@param @parami iThe Thevalue valuepushed pushedonto ontothe the **stack. stack. */*/ 136 Universität Bremen Stack mit JavaDoc-Kommentaren public publicvoid voidpush(int push(inti)i) {{ StackElement StackElementss==new newStackElement(); StackElement(); s.value = i; s.value = i; s.next s.next==first; first; first = s; first = s; }} /** /** **The Thefunction functionremoves removesthe thetopmost topmostelement elementfrom fromthe thestack stack **and returns it. <b>Note:</b> The stack must not be empty! and returns it. <b>Note:</b> The stack must not be empty! **@return @returnThe Thevalue valueremoved removedfrom fromthe thestack. stack. */*/ public publicint intpop() pop() {{ int inti i==first.value; first.value; first = first.next; first = first.next; return returni;i; }} }} Einführung in die Programmierung mit Java 137 Universität Bremen Beispiel: Dokumentieren mit JavaDoc Einführung in die Programmierung mit Java 138 Universität Bremen Beispiel: Dokumentieren mit JavaDoc Einführung in die Programmierung mit Java 139 Universität Bremen Datenströme Allgemein Datenströme leiten Daten seriell in ein Programm hinein bzw. wieder heraus Datenströme können umgeleitet werden, so kann die Eingabe aus einer Datei kommen bzw. die Ausgabe in eine Datei geschrieben werden Standard-Datenströme Standardeingabe Standardausgabe System.in (Instanz von InputStream) System.out (Instanz von PrintStream) Standardfehlerausgabe System.err (Instanz von PrintStream) Einführung in die Programmierung mit Java 140 Universität Bremen Datenströme in Java Byte-orientierte Datenstöme InputStream OutputStream FileInputStream, FilterInputStream, StringBufferInputStream ... FileOutputStream, FilterOutputStream, PrintStream ... Unicode-orientierte Datenströme Reader BufferedReader, FilterReader, InputStreamReader, StringReader ... Writer BufferedWriter, FilterWriter, OutputStreamWriter, PrintWriter, StringWriter ... Einführung in die Programmierung mit Java 141 Universität Bremen Datenströme in Java import importjava.io.*; java.io.*; class classMore More {{ static staticvoid voidmain(String[] main(String[]args) args)throws throwsIOException IOException {{ InputStreamReader InputStreamReaderisReader isReader== new newInputStreamReader(System.in); InputStreamReader(System.in); BufferedReader BufferedReaderbufReader bufReader== new newBufferedReader(isReader); BufferedReader(isReader); String Stringline line==bufReader.readLine(); bufReader.readLine(); while(line while(line!= !=null) null) {{ System.out.println(line); System.out.println(line); line line==bufReader.readLine(); bufReader.readLine(); }} }} }} Einführung in die Programmierung mit Java System.in System.in InputStream InputStream isReader isReader InputStreamReader InputStreamReader bufReader bufReader BufferedReader BufferedReader line line String String 142 Universität Bremen Beispiel: More Einführung in die Programmierung mit Java 143 Universität Bremen Übungsaufgaben Aufgabe 9 Aufgabe 10 Mindestens eines von den bisher erstellten Programmen JavaDoc-konform dokumentieren und mit JavaDoc eine Online-Dokumentation erstellen Aufgabe 11 Mindestens eines von den bisher erstellten Programmen „wasserdicht“ machen, d.h. alle zu erwartenden Exceptions auffangen und entsprechende Fehlermeldungen ausgeben Erstellen von zwei Programmen Zip und UnZip, die eine Datei komprimieren bzw. eine komprimierte Datei wieder auspacken Tipp Es gibt zwei Klassen GZIPInputStream und GZIPOutputStream, die das Einund Auspacken übernehmen Einführung in die Programmierung mit Java 144