Java Schulung Objektorientierte Programmierung in Java Teil II: Java Grundlagen und Syntax Prof. Dr. Nikolaus Wulff
Agenda: Java Grundlagen Java Syntax Java Datentypen Kontrollstrukturen Klassen und Objekte Überschreiben/Überladen von Methoden Sichtbarkeit Behandlung von Ausnahmen (Exceptions) Die wichtigsten Java Pakete Prof. Dr. Nikolaus Wulff 2
Abstrakte Datentypen Klassen sind die logische Erweiterung des Konzepts des ADT. In prozeduralen Sprachen werden ADT's durch Records (Pascal), Structs (C), Common-Blöcke (Fortran) oder Copy-Strecken (Cobol/PL1) realisiert. Dies sind jedoch lediglich reine Datencontainer. In der Objektorientierung werden diese ADT's um die Deklaration der möglichen, erlaubten Manipulationen erweitert. Klasse Daten + Methoden Ein Objekt ist eine Instanz einer Klasse Der entsprechende Speicherplatz für die Daten ist alloziiert und die Methoden können auf diese zugreifen. Prof. Dr. Nikolaus Wulff 3
Kapselung Kapselung Kapselung bedeutet, daß auf alle nicht exportierten Eigenschaften eines Objekts von außen nicht direkt zugegriffen werden kann. Wird die konkrete Repräsentation des Zustands verborgen, spricht man auch vom Geheimnisprinzip (Information Hiding, nach [Parnas72]). Kapselung heißt auch, daß die Signatur und das abstrakte Verhalten einer Operation bekannt ist, die Implementation aber verborgen bleibt. Nicht alle oo Programmiersprachen realisieren die Kapselung von Zustand und Implementationen geeignet. Prof. Dr. Nikolaus Wulff 4
Eine Klasse in Java Blockanfang public class Sparbuch { public void auszahlen( float betrag ) {... } public void einzahlen( float betrag ) {... } public void berechnezinsen() {... } } private float saldo; private float zinssatz; Blockende Für jede Klasse wird in Java eine eigene Datei angelegt. Beispiel: Sparbuch.java Operationen, (Methoden, Routinen) Attribute Prof. Dr. Nikolaus Wulff 5
Hauptprogramm Die Virtual-Machine wird unter Angabe eines Klassennamens gestartet. In dieser Klasse wird nach einer statischen Operation mit eine bestimmten Signatur gesucht, nämlich: public static void main(string[] args). Eine solche Operation kann es auch mehrfach in unterschiedlichen Klassen geben. Je nachdem welches main() gestartet werden soll, wird der entsprechende Klassenname der Virtual-Maschine übergeben. public class HelloWorld { public static void main(string[] args) { System.out.println("Hello, world"); } } Prof. Dr. Nikolaus Wulff 6
Konstruktoren Um dem Programmierer zu ermöglichen, die Initalisierung der Variablen eines Objekts zu beeinflussen, gibt es in Java die Möglichkeit, sogenannte Konstruktoren zu vereinbaren. Sie werden automatisch aufgerufen, wenn ein Objekt erzeugt wird. Konstruktoren sind Operationen, die den gleichen Namen wie die Klasse haben. Einschränkungen Konstruktoren dürfen keinen Rückgabetyp besitzen. "Nicht einmal" void. Sie können vom Programmierer nicht explizit aufgerufen werden. Sie werden vom Compiler automatisch eingefügt, sobald er auf eine Codezeile trifft, in der ein neues Objekt erzeugt wird. Prof. Dr. Nikolaus Wulff 7
Objekte erzeugen Objekte müssen zur Laufzeit durch einen expliziten Ausdruck erzeugt werden. Dazu wird der Konstruktor mit dem Schlüsselwort new verwendet. Sparbuch einurlaubssparbuch = new Sparbuch(); Sparbuch einnotgroschen = new Sparbuch(); Wird eine Variable mit dem Typ einer Klasse deklariert, so hat sie solange den Initialwert null, bis ihr ein Objekt zugewiesen wird. Sparbuch einurlaubssparbuch; // null Sparbuch einnotgroschen; // null einurlaubssparbuch = new Sparbuch(); einnotgroschen = einurlaubssparbuch; Prof. Dr. Nikolaus Wulff 8
Schlüsselworte Beachte: case-sensitive! abstract default if private throw boolean do implements protected throws break double import public transient byte else instanceof return try case extends int short void catch final interface static volatile char finally long super while class float native switch const* for new synchronized continue goto* package this * momentan nicht genutzt Keine Schlüsselworte: true, false, null Neu ab JDK1.4: assert Neu ab JDK1.5: enum Prof. Dr. Nikolaus Wulff 9
Java Konventionen Bezeichner: Neue Wörter beginnen mit Großbuchstaben. Keine Unterstriche zur Trennung verwenden. Also nicht drucke_kunden, sondern druckekunden. Klassennamen beginnen mit einem Großbuchstaben, z.b. Girokonto. Operationsnamen beginnen mit einem Kleinbuchstaben, z.b. zahleein. Einige Entwickler lassen Attributnamen mit einem Unterstrich beginnen, z.b. _saldo. (Aber bitte einheitlich!) Nach jeder öffnenden und vor jeder schließenden geschweiften Klammer eine neue Zeile beginnen. Optional: Vor jeder öffnenden geschweiften Klammer eine neue Zeile beginnen. Nach jeder öffnenden geschweiften Klammer eine Einrückung vornehmen. Vor der schließenden geschweiften Klammer diese Einrückung wieder zurücknehmen. Pro Anweisung eine Zeile. Moderne IDE's ermöglichen automatische Formatierung. Prof. Dr. Nikolaus Wulff 10
Java Bean Konvention In Java werden Attribute durch getxxx und setxxx Operationen gelesen bzw. gesetzt. Arrays werden entsprechend mit getxxx(int index) und setxxx(int index, Object val) angesprochen. Für boolean Attribute kann optional auch die Operation isxxx statt getxxx verwendet werden. Tools (IDE's und Generatoren) sowie die Java Reflection API verwenden diese Konvention! D.h. eine Klasse mit einer Eigenschaft XYZ hat eine entsprechende public XYZ getxyz() Methode für den lesenden Zugriff und eine public void setxyz (XYZ v) Methode für schreibenden Zugriff. Diese Namenskonvention ist für den Entwickler bindend (insbesondere set und get, gibx und setzex ist nicht konform!). Prof. Dr. Nikolaus Wulff 11
Elementare Typen Imperative und objektorientierte Programmiersprachen bieten i.d.r. einen Satz elementarer Typen an: Natürliche Zahlen (Integer) reale Zahlen (Float oder Real) Zeichen (char) und Wahrheitswerte (boolean). Java verfügt über eine Reihe von elementaren Typen (basic oder primitive types): int, short, long, float, double, byte, boolean und char. Der Typ einer Variable legt fest die Wertemenge (z.b. int nur ganze Zahlen) und die zulässigen Operationen (z.b. int Addieren, Subtrahieren) Prof. Dr. Nikolaus Wulff 12
Basisdatentypen und Literale Wahrheitswerte (boolean): Konstanten: true, false Zeichen (char): Konstanten: o, \t, \u78ab (Unicode hexadezimal) Zeichenketten (String): Konstanten: Hallo, Hello + + World\n ganze Zahlen: Konstanten: 47, 47890L (long), 077 (oktal), 07777L (oktal long), 0x89ab (hexadezimal), 0XC0B0L (hex long) Fließkommazahlen: Escape Sequenzen Konstanten: 3.141F, 6.02E23, 6.02E23F, 6.02E23D \ b /* backspace */ \ t /* horizontal tab */ \ n /* line feed */ \ f /* form feed */ \ r /* carriage return */ \ " /* double quote " */ \ ' /* simple quote ' */ \ \ /* backslash \ */ Prof. Dr. Nikolaus Wulff 13
Die numerischen Datentypen numerische Datentypen: Jede prozedurale Programmierspache bietet elementaren numerischen Datentypen mit den zugehörigen Operationen an. Die Wertebereiche dieser Datentypen sind meist maschinenabhängig, was die Übertragbarkeit von Programmen erschwert. In Java sind die elementaren Datentypen systemunabhängig festgelegt. Typ Größe Wertebereich byte 1 Byte -128 bis 127 short 2 Bytes -32.768 bis 32.767 int 4 Bytes -2.147.483.648 bis 2.147.483.647 long 8 Bytes -9.223.372.036.854.775.808 bis 9.223.372.036.854.775.807 float 4 Bytes 1,40239846*10-45 bis 3,40282347*10 38 double 8 Bytes 4,94065645841246544*10-324 bis 1,79769313486231570*10 308 Prof. Dr. Nikolaus Wulff 14
Basisdatentypen vs. Klassen (1) Für einige Typen existieren sowohl Basisdatentypen als auch Klassen, z.b. int (Basisdatentyp) und Integer (Klasse). Auf den Basisdatentypen sind mathematische Operationen vordefiniert, z.b. +, -, *, \. Die Klassen bieten weitere Methoden zur Manipulation an, z.b. Integer.parseInt( 89 ) zum Umwandeln einer Zeichenkette in eine Zahl. Werte der Basisdatentypen sind keine Objekte (Superklasse Object) und können daher an einigen Stellen nicht verwendet werden. Beispiele: Vector, Hashtable. Vector v = new Vector(); // Vektor von Objekten v.addelement(1); // Fehler 1 ist kein Objekt v.addelement(new Integer(1)); // o.k. Seit JDK1.5 gibt es autboxing 1 wird in Integer(1) verwandelt und addelement(1) funktioniert automatisch... Prof. Dr. Nikolaus Wulff 15
Basisdatentypen vs. Klassen (2) Literale evaluieren zu Werten von Basisdatentypen, z.b. 1 zu int. Ausnahme: Zeichenketten werden zu Objekten der Klasse String. Objekte müssen explizit angelegt werden, z.b. new Integer(1). Prof. Dr. Nikolaus Wulff 16
Basisdatentypen vs. Klassen (3) Unterschiede beim Vergleich (Wertgleichheit vs. Objektidentität): 1 == 1 new Integer(1)!= new Integer(1) Unterschiede bei der Zuweisung (Kopie vs.referenz): int a = 75; int b = 100; b = a; a = 200; // b == 75 // a!= b Integer a = new Integer(75); Integer b = new Integer(100); b = a; // Objektreferenz wird geändert a.setint(200); // b.intvalue() == 200 // a == b a b 75 100 a b 200 75 a b (2) (1) 75 100 a b (3) 200 Prof. Dr. Nikolaus Wulff 17
Operatoren Operator Funktion, arithmetisch * Multiplikation / Division % Modulo + Addition - Subtraktion ++ Inkrement -- Dekrement Der Gleichheitstest wird häufig mit der Operator ==!= = Funktion Gleichheit Ungleichheit Zuweisung Operator Zuweisung verwechselt saldo = 0; // Zuweisung saldo == 0; // Gleichheit saldo!= 0; // Ungleichheit Die Zuweisung liefert in Java ein Ergebnis: int i, j; i = j = 0; Redundante Operatoren: Funktion, boolesche logisches NICHT (NOT) kleiner als kleiner als oder gleich größer als größer als oder gleich logisches UND (AND) logisches ODER (OR) // Auswertung von rechts // nach links saldo++; saldo = saldo + 1; Prof. Dr. Nikolaus Wulff 18! < <= > >= &&
Operationen mit Basisdatentypen Zusammenziehen von Operationen und Zuweisungen möglich: sum = sum + count sum = sum + 1 Operationen mit Seiteneffekt: sum++ sum += count (a!= 0) & ((100 / a) > 10) u.u. Division durch 0 Short Circuit (&& und ): boolscher Ausdruck wird nur solange ausgewertet, bis das Ergebnis feststeht: (a!= 0) && ((100 / a) > 10) immer o.k. Prof. Dr. Nikolaus Wulff 19
Variablen und Konstanten Vor ihrer Verwendung müssen Variablen und Konstanten bekanntgemacht, d.h. deklariert werden. Das kann an jeder beliebigen Stelle im Source-Code geschehen: Angabe des Typs, der die Wertemenge und die zulässigen Operationen bestimmt, Nennung ihres Bezeichners. Vom Laufzeitsystem wird jede Variable mit einem standardisierten Initialwert belegt. Optional kann bei der Deklaration ein Initialwert zugewiesen werden. Syntax in Java: <VarDeklaration> := <Typ> <Bezeichner> Beispiel: int i; double d = 1.123; char c = 'a'; Eine Konstante wird mit dem Schlüsselwort final deklariert. Bei der Deklaration muß der Wert der Konstanten angegeben werden. Beispiel: final int i = 10; final double pi = 3.1415; final char a = 'a'; Prof. Dr. Nikolaus Wulff 20
Attribute Ein Attribut wird in der Klasse im Anschluß an die Operationen oder vor den Operationen deklariert (Wichtig: einheitliche Konvention im Projekt!). Dies geschieht durch: Festlegung der Sichtbarkeit, Angabe des Typs, Nennung ihres Bezeichners. Über die Sichtbarkeit wird festgelegt, ob und wer von Außen auf die Exemplarvariable zugreifen darf (näheres später). Auch die Exemplarvariablen können mit einem Initialwert versehen werden. Syntax in Java: <VarDeklaration> := <Sichtbarkeit> <Typ> <Bezeichner> Beispiel: private float zinssatz; private float saldo = 0.0; Prof. Dr. Nikolaus Wulff 21
Array Datentyp, der eine Menge von Elementen des gleichen Typs (Elementtyp) repräsentiert. Die Anzahl der Elemente ist fest und heißt Länge des Array. Der Name einer Array-Variablen bezeichnet den gesamten Array. Ein einzelnes Array-Element wird durch eine Nummer (Index) identifiziert. Ein Index ist eine ganze Zahl zwischen 0 und (Länge - 1). Arrays sind Objekte, es gibt aber keine explizite Array-Klasse(!) die Größe wird bei Erzeugung des Array-Objektes zur Laufzeit festgelegt. Eine dynamische Größenänderung ist nicht möglich. Die Länge des Arrays kann mit length ermittelt werden. length ist keine Operation, sondern eine Art Read-Only-Attribut. a a[i] 0 i N-1 Index Länge = N Prof. Dr. Nikolaus Wulff 22
Beispiel: Array public class Liste { private int[] array; private int anzahl; public Liste() { array = new int[10]; anzahl = 0; } public void elementhinzufügen(int e){ array[anzahl++] = e; }... Array des Typs int deklarieren, ohne Angabe der Arraygröße Erzeugen des Array-Objektes Zuweisung auf ein Element des Arrays } Prof. Dr. Nikolaus Wulff 23
Operationen Die nach Außen sichtbare Schnittstelle eines Objektes wird durch seine möglichen Operationen bestimmt. Der Aufruf einer Operation wird häufig auch Nachricht oder Botschaft genannt. Beispiel: Der EventService sendet die Nachricht aktualisierepostkorb an die Postkorb Instanz des Benutzers. Manchmal werden Operationen auch (etwas künstlich) in Prozeduren und Funktionen unterteilt. Prof. Dr. Nikolaus Wulff 24
Deklaration von Prozeduren Prozeduren sind verändernde bzw. manipulierende Operationen, die den Zustand des Objektes, mit dem sie gerufen werden, verändern. Eine Operation wird in Java dadurch als Prozedur gekennzeichnet, daß ihre Deklaration mit void eingeleitet wird. nach Außen sichtbar benutzerdefinierter Bezeichner für die Prozedur (in Java kleingeschrieben) public void einzahlen(float betrag ); Prozeduren liefern keinen Rückgabewert Parametername formaler Parameter vom Typ float Werden mehrere Parameter angegeben, muß für jeden Parameter der Typ mitgegeben werden. Die Parameter werden durch Komma getrennt. public void setzekonditionen(float habenzins, float sollzins); Prof. Dr. Nikolaus Wulff 25
Deklaration von Funktionen Funktionen sind sondierende Operationen, die den Zustand des Objektes, mit dem sie gerufen werden, nicht verändern dürfen. Der Funktionsname steht - im Unterschied zu einem Prozedurnamen - nicht nur für eine Anweisungsfolge, sondern auch für einen (Ergebnis-) Wert von einem vereinbarten (Ergebnis-) Typ. Funktionen können deshalb als Teil von Ausdrücken verwendet werden. Das Funktionsergebnis wird explizit (mittels der return Anweisung) zurückgegeben. Rückgabetyp float benutzerdefinierter Bezeichner für die Funktion public float gibsaldo( ); nach Außen sichtbar diese Funktion hat keine Parameter Prof. Dr. Nikolaus Wulff 26
Klassenimplementation Die Implementation einer Java-Klasse wird mit der Definition zusammen in derselben Datei.java durchgeführt. Beispiel: Sparbuch.java public class Sparbuch { private float saldo = 0; public void einzahlen(float wert){ this.saldo += wert; } public float getsaldo() { return this.saldo; } Für jedes Argument in der Liste der Parameter wird gesondert der Typ angegeben. Eine Funktion gibt ihren Rückgabewert mit return zurück. Wo immer im Code der Funktion die return- Anweisung steht, wird die Funktion verlassen. Prof. Dr. Nikolaus Wulff 27
Kommentare Einzeiliger Kommentar: r = p % q; // Rest berechnen Mehrzeiliger Kommentar: /* in den Zeilen nach diesem Kommentar wird der Rest einer Division berechnet */ r = p % q; Kommentare sind ein wichtiger Bestandteil eines Programms. Mittels JavaDoc wird eine HTML Dokumentation generiert. Dies erleichtert das Verständniss und die Wartbarkeit. Durch entsprechende Tools, wie z.b. Jalopy, lassen sich Regel zur Dokumentation einhalten. Kommentare immer eine logische Abstraktionsebene höher als der Code. Nicht: b = (a / 100) * 16; // 16% von a berechnen Sondern: b = (a / 100) * 16; // MWSt. berechnen Prof. Dr. Nikolaus Wulff 28
Ausnahmen Was passiert bei fehlerhaften Abläufen? Beispielsweise: Parameter haben falsche oder inkonsistente Werte. Bedingungen gelten nicht. Es fehlen Werte. int teile(int a, int b) { if (b == 0) { /*??? */ } else return a / b; } Was soll hier passieren? Rückgabe von Fehlerwerten (0, -1, null, "", "ERROR") nicht empfehlenswert, weil bei jedem Aufruf eine Prüfung erfolgen muss: int ergebnis = teile(8, 0); if (ergebnis == 0) { /* Fehler */ } else... Prof. Dr. Nikolaus Wulff 29
Erzeugung von Ausnahmen Ausnahme bedeutet: Die Bearbeitung kann nicht ordnungsgemäß fortgesetzt werden. Eine Ausnahme ist ein Objekt. Auslösen einer Ausnahme: Konstruktor if (b == 0) throw new ArithmeticException(); Ausnahmen können Parameter erhalten, wie bei jedem Konstruktor: Parameter if (t == null) throw new NullPointerException("t==null"); Mit dem throw Konstrukt wird der aktuelle Programmfluß unterbrochen und die Methode verlassen. Prof. Dr. Nikolaus Wulff 30
Ausnahmebehandlung try {... Block, der evtl. Ausnahmen auslöst } catch(exceptiontyp1 e1) {... Behandle die Ausnahmen des Typs ExceptionTyp1 } catch(exceptiontyp2 e2) {... Behandle die Ausnahmen des Typs ExceptionTyp2 } Beispiel try { throw new Exception("Here's my Exception"); } catch(exception e) { e.printstacktrace(); } Prof. Dr. Nikolaus Wulff 31
Einfangen von Ausnahmen Alle eigenen Ausnahmen werden von der Klasse Exception abgeleitet. MyException1 MyException11 Exception MyException2 try {... } catch(myexception1 e) {... Behandle die Ausnahmen des Typs MyException1und der Subklassen } catch(exception e) { Behandle... alle weiteren Ausnahmen Achtung: Beim Einfangen einer Ausnahme einer bestimmten Klasse werden auch alle Ausnahmen von Subklassen eingefangen. } Prof. Dr. Nikolaus Wulff 32
Ausnahme-Klassenhierarchie Alle Ausnahmen müssen behandelt werden (in try-catch-blöcken), bis auf Ausnahmen der Klasse RuntimeException und deren Subklassen. Systemfehlermeldungen sind von der Klasse Error abgeleitet. Throwable Exception Error MyException RuntimeException NullPointerException IlegalArgumentException Prof. Dr. Nikolaus Wulff 33
Die if-else-anweisung Beispiel 1: if (x < 0) y = -1; else if (x > 0) y = 1; else y = 0; Beispiel 2: if (x > 0) if (x == 42) y = 4711; else y = 0; Beispiel 3: if (x > 0) { if (x == 42) { y = 4711; } else { y = 0; } } if (expression) statement-1; else statement-2; Vorsicht bei geschachtelten if-anweisungen: ein else- Zweig bezieht sich immer auf die letzte if-anweisung ohne else-zweig. Explizite Klammerung hilft, Fehler zu vermeiden! Prof. Dr. Nikolaus Wulff 34
Die for-schleife Beispiel 1: for (init-statement; expression-1; expression-2) statement; int fak; for (fak=6; n > 1; n--) { fak = fak * (n - 1) } Beispiel 2: for (;;) { /* looping forever... */ } Vergleiche eine saubere For-Schleife: r := 0; FOR i := 1 TO 99 BY 2 DO r := r + i END; Bei Eintritt in die for-schleife kann keine feste Anzahl von Durchläufen garantiert werden, da der Wert der Laufvariablen innerhalb des Rumpfes der for-anweisung verändert werden darf. Da expression-2 ein beliebiger Ausdruck sein kann, ist nicht gewährleistet, daß die Laufvariable bei jedem Durchlauf erhöht bzw. erniedrigt wird. Da expression-1 ein beliebiger Ausdruck sein kann, ist nicht einmal gewährleistet, daß die Steuerung und der Abbruch der Schleife überhaupt mit Hilfe einer Laufvariablen erfolgt. Prof. Dr. Nikolaus Wulff 35
Beispiel Wir schreiben ein Programm zur Berechnung der Fakultät. Ziele: Anwenden der for-schleife und des if-konstrukts. Kennenlernen des rekursiven Methodenaufruf. Implementierung einer Fehlerbehandlung. Def.: a) als Produkt n n! := k k=1 b) per Rekursion 1! := 1 n! := n*(n-1)! Prof. Dr. Nikolaus Wulff 36
Die switch-anweisung Beispiel: ch = a ; switch ( ch ) case label { case A : case a : a_counter++; break; case E : case e : e_counter++; break; case I : case i : i_counter++; break; case O case o : o_counter++; break; case U : case u : i_counter++; break; }; default: consonant_counter++; break; Als case label verwenden wir Konstanten vom Typ int, long oder char. Was passiert, wenn die break-anweisung fehlt? zwei case label denselben Wert haben? keiner der Fälle zutrifft und die default-anweisung fehlt? Prof. Dr. Nikolaus Wulff 37
Die while- und do-schleife Beispiel einer while-schleife: r = p % q; while (r!= 0) { p = q; q = r; r = p % q; } Dasselbe Beispiel als do-schleife: r = p % q; if (r!= 0) do { p = q; q = r; r = p % q; } while (r!= 0); while-schleifen lassen sich immer als do-schleifen formulieren. while (expression) statement; do statement; while (expression) Vorsicht: die do-schleife ist genau wie die while-schleife eine Solange- Noch Schleife. Der Schleifenkörper wird ausgeführt, solange die Wiederholungsbedingung noch gültig ist. while-schleifen testen die Wiederholungsbedingung vor dem ersten Durchlauf. Ungeschützte do-schleifen laufen vor dem Test mindestens einmal durch. Prof. Dr. Nikolaus Wulff 38
Konvertierungen Automatisch short nach int int nach long long nach float float nach double String Automatische Konvertierung mit + Operator. Z.B. 15 + DM 2 + 11 + DM DM + 11 + 2 Manuelle Konvertierungen Explizit casten Z.B.: double d = 1.23; float f = (float) d; Prof. Dr. Nikolaus Wulff 39
Werkzeuge im JDK Falls keine IDE zur Verfügung steht... Java - Interpreter führt Java-Byte-Code aus. Javac - Compiler für Java-Programme. Übersetzt Java-Quellcode in Java-Byte-Code. Jdb - Kommandozeilen-Debugger. Javap - Disassembler für Java-Byte-Code. Javadoc - Erzeugt Dokumentation zu Java-Klassen in HTML. Appletviewer - Führt Applets aus. Java-Quellen haben die Endung.java. Java-Byte-Code hat die Endung.class. Prof. Dr. Nikolaus Wulff 40
JavaDoc Die Dokumentation gehört - ebenso wie lauffähige Tests - zur Qualitätssicherung eines jeden Projekts! Dokumentation kann durch Meta-Tags angereichert werden. Notwendige Kommentarform: /** * @author Dr. Nikolaus Wulff */ Weitere mögliche Meta-Tags, die von JavaDoc verwendet werden: @author @version @param @return @exception @since @see Prof. Dr. Nikolaus Wulff 41
Die JDK API als JavaDoc Packages Klassenbeschreibung Klassen Prof. Dr. Nikolaus Wulff 42
Beispiel Entwickelung eines Taschenrechners. Er bietet die vier grundlegenden Operationen +,-,*,/, die als Zeichen oder Text (add, sub, mult, div) eingegeben werden können. Die Ein- und Ausgabe erfolgt per Console. Prof. Dr. Nikolaus Wulff 43
Beispiel Taschenrechner Ziele: Anwenden des switch-case Konstrukts. Verwendung von Arrays. Auswerten der Kommandozeile Erweiterung der Fehlerbehandlung durch das Konzept der Assertions. Erstellung einer Dokumentation mit Javadoc. Prof. Dr. Nikolaus Wulff 44
Hinweis Trennen Sie das Parsen der Kommandozeile von der Berechnung. Verzweigen Sie in die eigentliche Berechnung mit einem switchcase Konstrukt. Zur Typumwandlung von String nach double die Klasse java.lang.double verwenden. In JavaDoc nachschauen... Geben Sie eine Fehlermeldung bei falschen Argumenten aus. Prof. Dr. Nikolaus Wulff 45