String

Werbung
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
Herunterladen