Informatik 2 – Teil 2 Grundlagen von Java (Fortsetzung) Übersicht 2.1 Referenztypen 2.15 Methoden der Klasse StringBuffer 2.2 Arrays (Datenfelder) I 2.16 Methoden der Klasse StringBuffer (Beispiel 3) 2.3 Arrays II 2.17 Die Klasse Math 2.4 Die Klasse Arrays 2.18 Beispiele für die Klasse Math 2.5 Ein Beispiel für Arrays 2.19 Das Überladen von Methoden 2.6 Ein Beispiel für Arrays (Ergebnis) 2.20 Hüllklassen 2.7 Die Klasse String 2.21 Standard-Eingabe 2.8 Der + - Operator bei Strings 2.22 Ausnahmen weitergeben 2.9 Methoden der Klasse String (Teil 1) 2.23 Ausnahmen bearbeiten 2.10 Methoden der Klasse String – Beispiel 1 2.24 Einfache und doppelte Logikoperatoren 2.11 Methoden der Klasse String (Teil 2) 2.12 Methoden der Klasse String – Beispiel 2 2.13 Beispiel 2 - Ausgabe 2.14 Die Klasse StringBuffer Prof. Martin Trauth Folie 1 / 25 Informatik 2 – Teil 2 Grundlagen von Java (Fortsetzung) 2.1 Referenztypen Neben den primitiven Datentypen (s. 1.6) kennt Java Referenztypen. Sie heißen so, weil ihre Anfangsadresse übergeben wird, wenn man sie als Parameter für Methoden verwendet (call by reference). Bei primitiven Datentypen wird der Wert übergeben (call by value). Referenztypen in Java sind: Arrays (Datenfelder) Strings (Zeichenketten) Objekte (Arrays und Strings sind auch Objekte, allerdings recht spezielle) Der „Bauplan“ für Array- und String-Objekte ist natürlich in entsprechenden Klassen (in der package java.lang) definiert. Man nennt diese „Datenklassen“. Wichtig: Objekte können als Methoden-Parameter übergeben werden und Elemente von Arrays sein. Hinweis: im Unterschied zu C sind Zeichenketten keine Inhalte von Datenfeldern, die mit einer binären 0 als letztes Element abgeschlossen werden. Man kann natürlich dennoch einzelne Zeichen (Typ char) in Arrays speichern. Hinweis: Wenn der Vergleichsoperator == auf Referenztypen angewendet wird, dann wird ermittelt ob die verglichenen Objekte identisch sind (gleiche Adressen!). Nur dann ist das Ergebnis true. Es genügt nicht wenn ihr Wert gleich ist. Prof. Martin Trauth Folie 2 / 25 Informatik 2 – Teil 2 Grundlagen von Java (Fortsetzung) 2.2 Arrays (Datenfelder) I Obwohl Arrays Objekte sind, werden sie anders deklariert als sonstige Objekte. Grund dafür ist die angestrebte Ähnlichkeit mit C-Programmcode. Syntax einer Array-Deklaration: <Datentyp> [ ] <Array-Name> ; Beispiel: int [ ] kundenNr ; Mit dieser Deklaration wurde nur festgelegt, dass kundenNr ein Integer-Array ist. Ein Objekt existiert noch nicht. Das muss erst erzeugt werden (auch „Initialisierung“ genannt). Dabei wird dann auch die Feldgröße festgelegt. Syntax der Objektgenerierung: Beispiel: <Array-Name> = new <Datentyp> [<Feldgröße>] ; kundenNr = new int[1000] ; Oder Deklaration und Objektgenerierung in einer Zeile, wie am Beispiel gezeigt (die gängigste Methode): int [ ] kundenNr = new int[1000] ; Man kann auch, wie bei C, die eckigen Klammern hinter den Arraynamen schreiben, statt hinter den Typ. Der JavaCompiler akzeptiert das. Wir bleiben hier aber bei der Java-Schreibweise. Der Zugriff auf Array-Elemente erfolgt wieder wie bei C, z.B. kundenNr[5] = 2728; Das erste Array-Element hat den Feldindex 0, d.h. bei Feldgröße 1000 hat das letzte Element den Index 999. Java achtet aber darauf, dass Feldgrenzen nicht überschritten werden (Laufzeit-Fehler, aber kein Systemabsturz). Prof. Martin Trauth Folie 3 / 25 Informatik 2 – Teil 2 Grundlagen von Java (Fortsetzung) 2.3 Arrays II Man kann auch mehrdimensionale Arrays definieren. Ein Beispiel für ein 2-dimensionales Array: double [ ] [ ] koordinaten = new double[10000] [10000]; Der Zugriff auf mehrdimensionale Arrays ist ebenfalls identisch mit der C-Syntax. Alternativ zur Verwendung des new-Operators kann ein Array auch literal erzeugt werden (d.h. durch Initialisierung mit Listen). Die Arraygröße entspricht der Anzahl der Listenelemente. Beispiel: double [ ] messreihe1 = {2.3, 5.97, 18.33, -0.34}; Bei mehrdimensionalen Arrays verwendet man verschachtelte Listen (wie bei C) zu literalen Erzeugung. Das wird aber selten verwendet. Da Arrays Objekte sind, können sie Objekteigenschaften- und Methoden haben. Sie sind aber sehr „einfache“ Objekte, weshalb nur ihre Eigenschaft length von Interesse ist. Das ist die Größe des Arrays. Mit <Arrayname>.length kann auf sie zugegriffen werden (Integer-Rückgabewert). Beispiel: i1 = messreihe1.length ; Warum die Länge des Arrays bestimmen? Die kennt man doch, oder? Nicht unbedingt, denn das Array könnte auch eine Objekteigenschaft eines „fremden“ Objekts sein (d.h. seine Klasse hat man nicht selbst programmiert), und dann ist es u.U. nützlich, seine Größe bestimmen zu können. Prof. Martin Trauth Folie 4 / 25 Informatik 2 – Teil 2 Grundlagen von Java (Fortsetzung) 2.4 Die Klasse Arrays Um mehr Methoden für den Umgang mit Arrays zur Verfügung zu haben, gibt es die Klasse Arrays. Ihre Methoden sind Klassenmethoden, d.h. man kann sie nicht direkt (per Punktoperator) mit Array-Objekten einsetzen. Die Verwendung von Klassenmethoden ist ähnlich der von Bibliotheksfunktionen in C. Die Klasse Arrays ist in der Package java.util enthalten (importieren!) Besonders nützliche Methoden der Klasse Arrays sind: fill() – füllt das Array (alle Elemente) mit einem parametrierbaren Wert. sort( ) – sortiert die Array-Elemente nach Wert in aufsteigender Folge. Syntax von Arrays.fill: Arrays.fill(<Arrayname>, <Füllelement>); Syntax von Arrays.sort: Arrays.sort(<Arrayname>); Beispiele werden im nächsten Abschnitt gezeigt. Prof. Martin Trauth Folie 5 / 25 Informatik 2 – Teil 2 Grundlagen von Java (Fortsetzung) 2.5 Ein Beispiel für Arrays import java.util.*; // vor der Klassendefinition das benötigte Paket (komplett) importieren public class MeinTest2_5 { public static void main(String[] args) { double[] numfeld = new double[6]; for (int i=0; i < 6; i++) numfeld[i] = 1.0; System.out.println(); // Array füllen per Zählschleife // nur neue Zeile anfangen (kein Parameter) for (int i=0; i < 6; i++) System.out.print(numfeld[i] + "\t"); System.out.println(); Arrays.fill(numfeld, 2.0); //fill-Methode der Klasse Arrays verwenden for (int i=0; i < 6; i++) System.out.print(numfeld[i] + "\t"); numfeld[2] = 9.; numfeld[4] = -2.2; // Werte zuweisen System.out.println(); for (int i=0; i < 6; i++) System.out.print(numfeld[i] + "\t"); Arrays.sort(numfeld); // Array sortieren System.out.println(); for (int i=0; i < 6; i++) System.out.print(numfeld[i] + "\t"); // und noch mal ausgeben } } Prof. Martin Trauth Folie 6 / 25 Informatik 2 – Teil 2 Grundlagen von Java (Fortsetzung) 2.6 Ein Beispiel für Arrays (Ergebnis) So sieht dann die Systemausgabe aus. 1.0 1.0 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 9.0 2.0 -2.2 2.0 -2.2 2.0 2.0 2.0 2.0 9.0 Prof. Martin Trauth Folie 6 / 25 Informatik 2 – Teil 2 Grundlagen von Java (Fortsetzung) 2.7 Die Klasse String Da viele Programmanwendungen mit Zeichenketten arbeiten bietet Java zwei spezielle Klassen dafür: die Klassen String und Stringbuffer. Objekte der Klasse String stellen Zeichenketten mit fester Länge da. Mit der Klasse Stringbuffer kann man variable Längen realisieren. Eine einfache, in doppelte Hochkommate geschriebene Zeichenkette ist in Java bereits ein Objekt der String-Klasse, auch wenn man es nicht explizit erzeugt hat. Man kann ihm einen Namen zuweisen, wie im folgenden Beispiel (Deklaration mit Initialisierung): String mystring = "Martin" ; Der Name mystring ist nun eine Referenz auf das String-Objekt "Martin" , d.h. mit mystring ist genau dieses Objekt gemeint. Man kann auch in der üblichen Schreibweise ein neues String-Objekt erzeugen: String string1 = new String("Trauth") ; Hier hat man es nun mit 2 Objekten zu tun: dem String-Objekt "Trauth", das als Parameter an den Konstruktor der String-Klasse übergeben wurde, und das neue Objekt string1. Die erste Schreibweise wird häufiger verwendet, denn das als Parameter übergebene String-Objekt ist sonst zu nichts mehr nütze. Hinweis: man kann auch einen Leerstring "" erzeugen. Prof. Martin Trauth Folie 7 / 25 Informatik 2 – Teil 2 Grundlagen von Java (Fortsetzung) 2.8 Der +-Operator bei Strings Strings lassen sich in Java ganz einfach miteinander verbinden, indem man sie mit dem +-Operator aneinander hängt. Es spielt keine Rolle, ob es Zeichenketten in Hochkommata oder mit Namen bezeichnete String-Objekte (Referenzen) sind. Sogar numerische Ausdrücke lassen sich in diese Kette einbauen. Sie werden automatisch in Strings umgewandelt. Als Ergebnis der Verkettung wird ein neues String-Objekt erzeugt. Ein Beispiel: public class MeinTest2_8 { public static void main(String[] args) { int n = 3; String string1; string1 = "Noch " + n + " Tage"; System.out.println(string1); } Noch ist string1 nur eine Referenz, aber noch kein Objekt. Hier wird string1 das durch die Verkettung neu erzeugte String-Objekt zugewiesen. Von nun an bezeichnet string1 genau dieses Objekt. } Die Ausgabe dieses Programms ist: Noch 3 Tage Hinweis: man kann arithmetische Ausdrücke wie 3 * 4 in die Zeichenkette einbauen. Sie werden ausgewertet (aus 3*4 wird also 12) und dann in Zeichenketten umgewandelt. Funktioniert aber nicht wenn addiert werden soll. In dem Fall würde 3 + 4 nicht 7 ergeben, sondern die Zeichen 3 und 4 hintereinander – geschrieben 34. Will man das nicht, muss man den arithmetischen Ausdruck in Klammern setzen. Beispiel: "Das Ergebnis von 3 + 4 ist " + (3 + 4); Resultatstring: Das Ergebnis von 3 + 4 ist 7 Prof. Martin Trauth Folie 9 / 25 Informatik 2 – Teil 2 Grundlagen von Java (Fortsetzung) 2.9 Methoden der Klasse String (Teil 1) Da wir Objekte der Klasse String generieren, wird mit Objekt-Methoden gearbeitet. Die Klasse String enthält sehr nützliche Methoden für die Textverarbeitung. Methoden zum Überprüfen eines Strings. Parameter ist immer ein (anderer) String. Die Rückgabewerte sind vom Typ boolean: equals() – Überprüft ob Parameter-String inhaltsgleich mit dem String-Objekt ist, zu dem die Methode gehört. equalsIgnoreCase() tut das Gleiche, ignoriert aber Groß-Kleinschreibung. startsWith() – überprüft, ob der Parameterstring am Anfang des Objekts steht, zu dem die Methode gehört. regionMatches() – diese Methode überprüft Übereinstimmung von String-Abschnitt. Sie hat mehrere Parameter. In Reihenfolge: Groß/Kleinschreibung ignorieren (Parameter muss dann true sein, bei false wird die Groß/Kleinschreibung beachtet), Startposition des Vergleichs (erste Stelle ist bei Position 0), die zu vergleichende Zeichenkette, Startposition der Zeichenkette im Parameter-Objekt, Anzahl der zu vergleichenden Zeichen). Methoden zum Verändern eines Strings. replace() – sucht ein Zeichen im String-Objekt und ersetzt dieses durch ein anderes. 1. Parameter: das zu suchende Zeichen, 2. Parameter: das Zeichen, das dieses ersetzt. Es wird ein neues String-Objekt zurück gegeben, aber nur wenn mindestens ein Zeichen gefunden wurde. toUpperCase() / toLowerCase() – setzt alle Buchstaben auf Groß- bzw. Kleinbuchstaben um. Prof. Martin Trauth Folie 10 / 25 Informatik 2 – Teil 2 Grundlagen von Java (Fortsetzung) 2.10 Methoden der Klasse String – Beispiel 1 Die vorgestellten Methoden werden hier im Beispiel verwendet: public class MeinTest2_9 { public static void main(String[] args) { String string1 = "Wir sind nicht doof"; String string2 = "nicht"; System.out.println(string1.equals(string2)); // -> false System.out.println(string2.equals("nicht")); // -> true System.out.println(string1.startsWith("Wi")); // -> true System.out.println(string1.regionMatches(true, 5, string2, 0, 3)); // -> false string2 = string1.replace('i', 'u'); Beachten: einfache Hochkommata weil Einzelzeichen (char) System.out.println(string2); -> „Wur sund nucht doof“ System.out.println(string2.toUpperCase()); -> „WUR SUND NUCHT DOOF“ } } Prof. Martin Trauth Folie 11 / 25 Informatik 2 – Teil 2 Grundlagen von Java (Fortsetzung) 2.11 Methoden der Klasse String (Teil 2) Weitere Methoden von String-Objekten: indexOf() – Ermittelt die Position des Parameter-Strings in der Zeichenkette des Objekts (erste Position bei 0). trim() – ohne Parameter. Liefert ein neues String-Objekt als Rückgabewert, bei dem Leerzeichen und nicht druckbare Zeichen von Anfang und Ende des ursprünglichen Objekt-Strings entfernt wurden. substring() – liefert ein neues String-Objekt als Rückgabewert, das einen Teil der Zeichenkette des Ursprungsobjekts enthält. 2 Parameter: Anfangs- und Endposition des zu kopierenden Teil-Strings im Ursprungsstring (von – bis) length() – ohne Parameter. Liefert die Länge der Zeichenkette als Integer-Rückgabewert. Die Klassenmethode valueOf() : valueOf() wandelt den Wert der Parametervariable in einen String (also ein neues Objekt) um. Es ist eine Klassenmethode, denn wenn sie aufgerufen wird existiert ja noch gar kein String-Objekt. Prof. Martin Trauth Folie 12 / 25 Informatik 2 – Teil 2 Grundlagen von Java (Fortsetzung) 2.12 Methoden der Klasse String – Beispiel 2 Die vorgestellten Methoden werden hier im Beispiel verwendet: public class MeinTest2_12 { public static void main(String[] args) { String string1 = " Ciao Bello "; string1.trim(); System.out.println(string1); string1 = string1.trim(); System.out.println(string1); System.out.println(string1.indexOf("ao")); System.out.println(string1.substring(5, string1.length() - 2)); System.out.println(string1); System.out.println(String.valueOf(string1 == "Ciao Bello")); } } Prof. Martin Trauth Folie 11 / 25 Informatik 2 – Teil 2 Grundlagen von Java (Fortsetzung) 2.13 Beispiel 2 - Ausgabe Die Ausgabezeilen von Beispiel 2 werden hier kommentiert: Ciao Bello Ciao Bello hier sind noch Leerzeichen. Die trim-Methode wirkt nicht auf das Ursprungsobjekt sondern gibt ein neues Objekt zurück (das aber nicht ausgegeben wird)! 2 Bel Ciao Bello false Der Operator == vergleicht nicht die Inhalte der beiden Objekte (dafür müßte man die equalsMethode nehmen), sondern ihre Adressen, da es Referenztypen sind. Mit anderen Worten: der Vergleich hätte nur dann true als Ergebnis wenn die Objekte identisch wären. Prof. Martin Trauth Folie 11 / 25 Informatik 2 – Teil 2 Grundlagen von Java (Fortsetzung) 2.14 Die Klasse StringBuffer StringBuffer-Objekte können Zeichenketten variabler Länge enthalten. Daher verwendet man sie vorzugsweise für das Einfügen und Anhängen von Texten. Der Speicherbedarf wird dabei automatisch angepasst. Erzeugt werden StringBuffer-Objekte nach der üblichen Methode. Der Parameter für den Konstruktor kann dabei auf 3 Arten verwendet werden: 1: StringBuffer myBuffer = new StringBuffer("") ; Es wird ein leeres Objekt erzeugt, aber standardmäßig Platz für 16 Zeichen reserviert. 2: StringBuffer myBuffer = new StringBuffer(60) ; Parameter vom Typ int. Es wird ein leeres Objekt erzeugt, aber Platz für 60 Zeichen (= Parameter-Wert) reserviert. 3: StringBuffer myBuffer = new StringBuffer("Input") ; Der Parameter ist hier vom Typ String (nicht etwa vom Typ StringBuffer). Es wird ein StringBuffer-Objekt mit den Zeichen des Strings erstellt und zusätzlich Platz für 16 Zeichen reserviert. Prof. Martin Trauth Folie 7 / 25 Informatik 2 – Teil 2 Grundlagen von Java (Fortsetzung) 2.15 Methoden der Klasse StringBuffer Die wichtigsten Objekt-Methoden der Klasse String-Buffer. length() – ohne Parameter. Gibt als Integer-Wert die Länge der gespeicherten Zeichenkette zurück. capacity() – ohne Parameter. Gibt als Integer-Wert die Größe des reservierten Speicherbereichs (in UnicodeZeichen à 16 bit) zurück. insert() – fügt eine Zeichenkette (Typ String) ein. Der erste Parameter (int) gibt die Startposition an, der zweite Parameter ist das einzufügende String-Objekt. append() – hängt eine Zeichenkette an, die als Parameter übergeben wird. reverse() – ohne Parameter. Kehrt die Reihenfolge der Zeichen in der Zeichenkette um. Eine Besonderheit: die Methoden insert(), append() und reverse() verändern nicht nur das Ursprungsobjekt, sondern geben es auch als Rückgabeobjekt zurück (genau gesagt geben sie dessen Adresse zurück). Dadurch kann man sie in Form einer „Methodenkette“ einsetzen. Siehe nachfolgendes Beispiel. Die meisten Ausgaberoutinen arbeiten auch mit StringBuffer-Objekten. Benötigt man aber dennoch ein String Objekt, dann kann man es einfach erzeugen (mit dem new-Operator), denn der Konstruktor der Klasse String verarbeitet auch StringBuffer-Objekte als Parameter. Beispiel (myBuffer ist ein Objekt der Klasse StringBuffer): String ein_string = new String(myBuffer) ; Prof. Martin Trauth Folie 10 / 25 Informatik 2 – Teil 2 Grundlagen von Java (Fortsetzung) 2.16 Methoden der Klasse StringBuffer – Beispiel 3 Die vorgestellten Methoden werden hier im Beispiel verwendet: public class MeinTest2_16 { public static void main(String[] args) { StringBuffer myBuffer = new StringBuffer("Wir wollen Stress"); myBuffer.insert(11, "keinen "); System.out.println(myBuffer); System.out.println(myBuffer.capacity()); System.out.println(myBuffer.append(" haben")); myBuffer.append(", oder").append("?"); // „Methodenkette“ System.out.println(myBuffer); }} Ausgabe: Wir wollen keinen Stress 33 Wir wollen keinen Stress haben Wir wollen keinen Stress haben, oder? Prof. Martin Trauth Folie 11 / 25 Informatik 2 – Teil 2 Grundlagen von Java (Fortsetzung) 2.17 Die Klasse Math Will man mathematische Operationen anstellen, die über die Grundrechenarten hinaus gehen, dann sind die Methoden der Klasse Math nützlich. Die Math-Klasse ist im Standardpaket java.lang enthalten. Es muss also nichts importiert werden. Die wichtigsten Klassen-Methoden: Math.pow() – potenziert den ersten Parameter mit dem zweiten (Math.pow(x,y) berechnet xy ) Math.sqrt() – zieht die Quadratwurzel des Parameters. Math.abs() – berechnet den Absolutwert des Parameters. Math.max() und Math.min() benötigen 2 Parameter und geben des größeren bzw kleineren von ihnen zurück. Math.sin(), Math.cos() und Math.tan() berechnen Sinus, Cosinus und Tangens des Parameters (der im Bogenmaß angegeben werden muss). Math.asin(), Math.acos() und Math.atan() sind die entsprechenden Arcus-Funktionen. Math.exp() berechnet e potenziert mit dem Parameter. Math.log() berechnet den natürlichen Logarithmus des Parameters. Math.round() gibt den dem Parameter am nächsten liegende Integerwert zurück. Math.random() erzeugt eine double-Zufallszahl im Bereich 0. bis 1. (inklusive 0, exklusive 1). Math enthält auch mathematische Konstanten als Klasseneigenschaften. Math.PI ist natürlich die Zahl Pi. Prof. Martin Trauth Folie 19 / 25 Informatik 2 – Teil 2 Grundlagen von Java (Fortsetzung) 2.18 Beispiele für die Klasse Math public class MainTest2_18 { public static void main(String[] args) { double x = 2.5; System.out.println(Math.exp(x)); // berechnet e2.5 System.out.println(Math.pow(x, 3)); System.out.println(Math.cos(Math.PI)); System.out.println(Math.min(x, -4.)); Bei 2.5 wird auf 3 aufgerundet System.out.println(Math.round(x)); } } Die Ausgabezeilen dieses Programms: 12.182493960703473 15.625 -1.0 -4.0 3 Prof. Martin Trauth Folie 20 / 25 Informatik 2 – Teil 2 Grundlagen von Java (Fortsetzung) 2.19 Das Überladen von Methoden Die meisten Methoden der Math-Klasse arbeiten mit double-Parametern und geben auch double-Werte zurück. Im Übrigen wandelt Java den Typ im Bedarfsfall um (ähnlich wie C, und auch casts gibt es). Aber einige Methoden, z.B. Math.abs() haben eine Besonderheit: ihr Rückgabewert hängt vom Typ des Parameters ab. Das funktioniert, weil Java Methoden „überladen“ kann (wichtige Funktionalität!). Damit ist Folgendes gemeint: Es gibt mehrere Methoden gleichen Namens in der Klasse. Sie unterscheiden sich aber im Datentyp der Parameter und/oder in der Anzahl der Parameter. Die zu den im Aufruf verwendeten Parametern passende Methode wird verwendet. Auch bei der Methode String.valueOf() können verschiedene Datentypen verarbeitet werden. Nehmen wir zum Beispiel an, dass der Parameter den Typ boolean hat. Dann greift eine Methode valueOf, deren Parameter als boolean deklariert wurde. Beispiel (Programmaussschnitt): public static String valueOf(boolean inval) { if (inval) return "true"; else return "false"; } Viel komplizierter ist es, eine double-Variable in einen String umzuwandeln. Die Methode public static String valueOf(double inval), die für double-Parameter zuständig wäre, ist daher mit Sicherheit etwas länger... Übrigens können auch Konstruktoren (die ja auch Methoden sind) überladen werden. Das wird sogar sehr häufig gemacht. Prof. Martin Trauth Folie 20 / 25 Informatik 2 – Teil 2 Grundlagen von Java (Fortsetzung) 2.20 Hüllklassen Weil primitive Datentypen keiner Klasse angehören und keine Objekte bilden können, fehlen einige Möglichkeiten von Java. Aus diesem Grund hat man die Hüllklassen (wrapper classes) geschaffen. Sie tragen die Namen der primitiven Datentypen, werden aber groß geschrieben (wie für Klassen üblich) und nicht abgekürzt. Also Integer für den Typ int, Character für den Typ char und bei allen anderen einfach der Typname groß geschrieben. Meist werden Hüllklassen zum Umwandeln von Typen verwendet. Die wichtigsten Klassenmethoden sind: parse... (parseInt für Integer, parseDouble für double-Variable) wandelt Strings (als Parameter) in numerische Werte um (numerischer Wert als Rückgabewert). double d1; d1 = Double.parseDouble("14.8"); Auch Wandlungen primitiver Typen in String sind verfügbar. Es gibt toString(), toBinaryString() und toHexString(). Sie erzeugen aus numerischen Variablen Zeichenketten mit Dezimalzahlen, binären Zahlen oder HexZahlen. Beispiel für Integer: int i1 = 318; String myStr; myStr = Integer.toHexString(i1); System.out.println(myStr); // Ausgabe ist 13e toString() gibt es auch als Objektmethode (eines Objekts vom Typ der Hüllklasse), was aber wenig verwendet wird. Prof. Martin Trauth Folie 21 / 25 Informatik 2 – Teil 2 Grundlagen von Java (Fortsetzung) 2.21 Standard-Eingabe Es gibt eine Standard-Eingabe (PC: von Tastatur), genau wie es eine Standard-Ausgabe (PC: auf dem Bildschirm) gibt und die ähnliche Syntax hat. Beispiel: public class MeinTest2_21 { public static void main(String[] args) { int code; code = System.in.read(); Compiler-Fehler wird gemeldet. System.out.println(code); } } Von der Tastatur wird ein Code gelesen, d.i. eine Integerzahl. Aber für Java ist das noch kein Zeichen (anders als in C !). Dazu müßte es in eine char-Variable umgewandelt werden, z.B. durch einen cast. Leider funktioniert das Programm so noch nicht. Der Grund dafür ist, dass die Methode System.in.read() eine so genannte Ausnahme (exception) erzeugen kann. Die aufrufende Methode (in unserem Falle ist das main() ) muss in so einem Fall die Ausnahme irgendwie abfangen. Davon handelt der nächste Abschnitt. Ausnahmen (exceptions) sind keine Fehler (errors). Errors führen zum unkontrollierten Verhalten oder zum Abbruch des Programms, während mit Ausnahmen kontrolliert umgegangen werden kann. Prof. Martin Trauth Folie 22 / 25 Informatik 2 – Teil 2 Grundlagen von Java (Fortsetzung) 2.22 Ausnahmen weitergeben Ausnahmen einer Methode kann die aufrufende Methode entweder weitergeben oder behandeln. Wenn weitergegeben wird, dann hat die nächst höhere Methode in der Aufruf-Hierarchie den „schwarzen Peter“. Sie muss dann selbst die Ausnahme behandeln oder wieder weitergeben. Wird weitergegeben bis zur main-Methode (für die es keine aufrufende Methode gibt), dann geht die Ausnahme an die Java-VM. Diese wird das Programm beenden und eine Fehlermeldung ausgeben. Beispiel für Ausnahme-Weitergabe. Nun ist unser Beispiel der Standardeingabe lauffähig. public class MeinTest2_21 { public static void main(String[] args) throws java.io.IOException { int code; Die Weitergabe mit „throws“ muss nach der Parameterliste und vor dem Methodenblock (geschweifte Klammer) stehen. code = System.in.read(); System.out.println(code); System.out.println((char) code); }} Wenn man z.B. das Zeichen j eingibt, dann ist die Ausgabe 106 (der ASCII-Code) und j. Die Standard-Eingabe liest ähnlich wie die C-Funktion getchar() immer nur ein Zeichen aus dem Tastaturpuffer. Zum Lesen mehrerer Zeichen(codes) muss man eine Schleife verwenden. Die Standard-Eingabe wartet auf die Eingabe-Taste. Prof. Martin Trauth Folie 23 / 25 Informatik 2 – Teil 2 Grundlagen von Java (Fortsetzung) 2.23 Ausnahmen behandeln Methoden, die eine Ausnahme erzeugen („werfen“) können, kann man sozusagen probeweise aufrufen. Man tut dies in einem try-Block (s.u.). Falls eine der Methoden im try-Block eine Ausnahme erzeugt, wird der nachfolgende catch-Block ausgeführt. Er muss direkt auf den try-Block folgen. Es kann mehrere catch-Blöcke geben, die unterschiedliche Ausnahmenklassen behandeln. Ausnahmen sind Objekte und leiten sich daher von Klassen ab. public class MeinTest2_23 { Catch hat das zu behandelnde Ausnahme-Objekt als Argument. public static void main(String[] args) throws java.io.IOException Der erste catch-Block wird natürlich zuerst ausgeführt und wenn dort ein Programmstop steht (wie im Beispiel mit System.exit()), dann werden die folgenden nicht mehr ausgeführt. { char ch1; int code = System.in.read(); int i1; Optional ist nach allen catch-Blöcken ein finallyBlock möglich, der in jedem Fall ausgeführt wird (außer nach System.exit() ). ch1 = (char)code; try { i1 = Integer.parseInt(Character.toString(ch1));} catch(java.lang.NumberFormatException e) { System.out.println("keine Zahl!"); System.exit();} System.out.println(i1); Die Ausnahme wird ausgelöst, wenn man einen Buchstaben eingibt, denn parseInt kann aus einem Buchstaben keinen Integerwert machen. Die Methode Character.toString() wird benötigt, weil parseInt einen String als Parameter braucht und ch1 den Typ char hat. }} Prof. Martin Trauth Folie 24 / 25 Informatik 2 – Teil 2 Grundlagen von Java (Fortsetzung) 2.24 Einfache und doppelte Logikoperatoren Eine Bemerkung zu Logikoperatoren: In Java gibt es wie in C die doppelten Operatoren && (UND) und || (ODER). Sie tun auch genau das was sie in C tun, verknüpfen allerdings Ausdrücke vom Typ boolean. Ganzzahl-Ausdrücke kann man damit nicht verknüpfen. Daneben kennt Java noch die einfachen Logikoperatoren & und |. Diese kann man auf Ganzzahlausdrücke anwenden (z.B. long). Sie bewirken dann bitweise Logikoperationen, wie in C. Man kann sie aber auch mit Logikausdrücken (Typ boolean) anwenden. In dem Fall wirken sie wie die doppelten Logikoperatoren, aber mit vorzeitigem Abbruch der Auswertung, wenn das Ergebnis des gesamten Logikausdrucks feststeht. Beispiel: x = a | b | c; Falls a true ist, wird gar nicht weiter ausgewertet, denn dann ist es egal welchen Logikwert b oder c haben – der Ausdruck ist immer true. Diese Art der Auswertung spart Zeit, aber man muss aufpassen, denn wenn einer der Operanden ein Ausdruck ist, der ausgewertet werden soll (z.B. eine Methode), dann unterbleibt dies eventuell. Prof. Martin Trauth Folie 25 / 25