Flow Control,Assertions and Exception Handling
- Write code using if and switch statements and identify legal argument types for these statements.
- Write code using all forms of loops including labeled and unlabeled, use of break and continue, and state the values taken by loop counter variables during and after loop execution.
- Write code that makes proper use of exceptions and exception handling clauses (try, catch(), finally) and declares methods and overriding methods that throw exceptions.
- Recognize the effect of an exception arising at a specified point in a code fragment. Note: The exception may be a runtime exception, a checked exception, or an error (the code may include try, catch, or finally clauses in any legitimate combination).
- Write code that makes proper use of assertions, and distinguish appropriate from inappropriate uses of assertions.
- Identify correct statements about the assertion mechanism.
Write code using if and switch statements and identify legal argument types for these statements.
Allgemeines- Der Compiler prüft, ob alle Elemente erreichbar sind.
- Der Compiler prüft, ob in allen Pfaden die lokalen Variablen initalisiert sind, bevor sie benutzt werden.
- Eine lokale Variable kann in einem Block erneut deklariert und initialisiert werden, wenn sie vorher in einem anderen Block ausserhalb der Reichweite der neuen Deklaration ist.
- Das Argument von einer if-Anweisung muss immer ein boolean sein.
- Das Argument von einer switch-Anweisung muss byte, short, char oder int sein.
- Der Compiler prüft, ob der case-Wert im Gültigkeitsbereich des Datentyps ist. Der folgende Code bringt Fehler, weil die Variable b im Wertebereich -128 und 127 liegt.
byte b; . . . switch (b) { case 130: ...; }
- Der case-Wert muss ein konstanter und eindeutiger Ausdruck sein.
- Die else-Anweisung gehört immer zur vorhergehenden if-Anweisung:
if (ergebnis >= 0) if (ergebnis > 0) System.out.println("positiv"); else System.out.println("negativ");
Hier könnte man denken, dass die else-Anweisung zur ersten if-Anweisung gehört, was aber nicht stimmt. Richtige Schreibeweise wäre:
if (ergebnis >= 0) if (ergebnis > 0) System.out.println("positiv"); else System.out.println("negativ");
- Mit der Anweisung else if kann man verschiedene Verzweigungen erzeugen.
- Jeder case-Bereich endet normalerweise mit der Anweisung break;, es sei denn man möchte, dass die Befehle in dem nächsten case-Block ausgeführt werden.
- Der default-Block muss nicht unbedingt als letzter Block sein. Diesen Block kann man überall platzieren.
- switch-Konstruktoren können leer sein. Aber alle Anweisungen in einem switch-Konstrukt müssen entweder in einem case- oder in einem default-Block platziert sein.
Write code using all forms of loops including labeled and unlabeled, use of break and continue, and state the values taken by loop counter variables during and after loop execution.
Schleifen- In Java gibt es drei Arten von Schleifen: while, do, for.
- Alle Schleifen werden durch boolsche Ausdrücke gesteuert.
- In while- und for Schleifen wird überprüft, ob Bedingung erfüllt wird. Wenn die Bedingung true, also wahr ist, wird die Schleife wiederholt, bis die Bedingung false ist.
- In der do-Schleife wird die Schleife mindestens einmal ausgeführt, erst dann wird überprüft, ob Bedingung true ist.
- Die allgemeine Form von einer for-Schleife sieht wie folgt aus:
for (Initialisierung ; Bedingung ; Iteration) Schleifen-Anweisung;
- Der Initialisierungsteil wird einmal am Anfang ausgeführt.
- Die Bedingung wird nach jedem Schleifendurchlauf getestet, erst wenn diese true ist, werden die Anweisung ausgeführt und danach der Iterationsteil.
- Der Iterationsteil wird immer ausgeführt, auch wenn beim ersten Mal die Bedingung nicht erfüllt ist.
- Die Initialisierung und Iteration können leer sein.
- Im Initialisierungsteil können mehrere Variablen deklariert und initialisiert werden; sie müssen aber mit Kommas getrennt sein.
- Im Iterationsteil können mehrere Anweisungen stehen; sie müssen ebenfalls mit Kommas getrennt sein.
- Der Ausdruck for (;;) ist erlaubt. Es ist eine Endlosschleife.
- Im Examen werden Sie abgefragt, welchen Wert eine Variable in einer Schleife bzw. nach der Schleife hat.
Achtung: Wenn im Deklarationsteil einer for-Schleife eine Variable deklariert wurde, ist sie nach dem Schleifendurchgang nicht mehr erreichbar, d.h. diese Variable existiert nicht mehr. - Der Iterationsteil einer for-Schleife muss nicht unbedingt eine Variable iterieren. Hier kann auch ein anderer Ausdruck stehen und die Variable kann in der Schleife iteriert werden.
Beispiel:
for (int i=0; i<4 ; System.out.println("Wert: " + i)) { i += 2; } Ausgabe: Wert: 2 Wert: 4
- Alle drei Schleifenarten unterstützen die break- und continue-Anweisungen.
- Für alle drei Schleifen gilt: wenn die break-Anweisungen kommt, beende die aktuelle Schleife sofort und gehe zur nächsten Anweisung nach der Schleife. Schleifenbedingung wird nicht geprüft. Bei der for-Schleife wird der Iterationsteil nicht ausgeführt.
- Für alle drei Schleifen gilt: wenn die continue-Anweisung kommt, beende die aktuelle Schleife sofort und führe den nächsten Schleifendurchgang aus. Bei der for-Schleife wird zuerst der Iterationsteil ausgeführt und erst danach die Bedingung überprüft.
- continue-Anweisung wird nicht in einem switch-Block benutzt.
- Schleifen können benannt werden (labels). Hier gilt: hinter dem Namen muss ein Doppelpunkt sein, erst danach kommt die Schleife.
- break-Anweisung beendet den aktuellen Schleifendurchgang sofort und springt zum Ende der Schleife mit dem angegebenen Namen.
- continue-Anweisung beendet den aktuellen Schleifendurchgang, springt zur Schleife mit dem angegebenen Namen und führt den nächsten Schleifendurchgang aus.
- Die Labels unterstehen den gleichen Namensregeln wie die Variablen.
Write code that makes proper use of exceptions and exception handling clauses (try, catch(), finally) and declares methods and overriding methods that throw exceptions.
Recognize the effect of an exception arising at a specified point in a code fragment. Note: The exception may be a runtime exception, a checked exception, or an error (the code may include try, catch, or finally clauses in any legitimate combination).
Diese beiden Blöcke habe ich zusammengefasst, weil sie eng zueinander stehen.Exceptions
- Exceptions sind Fehler, die zur Laufzeit des Programms auftreten und den Programmlauf unterbrechen. Sie können vom Programmierer abgefangen, bearbeitet oder auch weitergeleitet werden.
- Alle Exceptions sind abgeleitet von der Klasse java.lang.Exceptions. Mit Ausnahme der java.lang.RuntimeExceptions bzw. die Subklassen der RuntimeExceptions sind sie kontrollierte Exceptions (checked exceptions).
- Alle kontrollierten Exceptions müssen vom Programmierer abgefangen und behandelt werden. Das Abfangen wird vom Compiler überprüft.
- Exceptions werden abgefangen mit try/catch-Mechanismus. Einem try-Block kann eine oder mehrere catch-Blöcke folgen. Erst danach kommt ein finally-Block.
- Wenn ein finally-Block existiert, ist der catch-Block optional. finally oder catch müssen immer mit try zusammen auftreten. Wenn alle vorhanden sind, so ist die Reihenfolge try-catch-finally.
- Try-Block darf niemals alleine stehen. Mindestens ein catch-Block oder das finally-Block muss vorhanden sein.
- Wenn ein Exception auftritt, so wird der try-Block sofort beendet. Mit einem catch-Block kann dieser Exception abgefangen werden und behandelt werden.
- Der finally-Block wird immer ausgeführt, Auch wenn kein Fehler auftreten sollte. finally-Block wird nicht ausgeführt, wenn ein schwerer Fehler auftritt (Fatal Error) oder wenn explizit die Anweisung System.exit() aufgerufen wird.
- Errors und Exceptions sind Subklassen von Throwable.
- Errors und RuntimeExceptions müssen nicht behandelt werden. Die häufigsten RuntimeExceptions sind java.lang.NullPointerException und die java.lang.ArrayIndexOutOfBoundsException.
- Bei der Weiterleitung einer Exception wird die Exception an die aufrufende Methode weitergeleitet. Hierbei wird hinter der Methodendeklaration die throws-Klausel mit den entsprechenden Exceptions angehängt. Im aufrufenden Anweisungsblock wird dann die Exception behandelt.
- Eine Methode, die überschrieben wird, darf keine checked Exception erzeugen, wenn nicht die überschriebene Methode nicht auch diese Exception wirft oder eine Superklasse dieser Exception.
Write code that makes proper use of assertions, and distinguish appropriate from inappropriate uses of assertions.
Identify correct statements about the assertion mechanism.
Diese beiden Blöcke habe ich zusammengefasstAssertion (Zusicherungen)
- Mit der Anweisung assert kann eine Zusicherung (Assertion) gemacht werden. Es ist hilfreich beim Entwickeln des Programmcodes. AssertionsExceptions sind eigentlich nur für den Programmierer gedacht.
- AssertionException tritt nur auf, wenn der Ausdruck hinter der assert-Anweisung "false" ist.
- Die Zusicherungen gibt es erst seit der Java-Version 1.4. Die Assertion ist aber bei der Version noch ausgeschaltet, denn es kann ja sein, dass das Programmcode mit einer älteren Version fehlerfrei kompiliert wurde und jetzt ein Fehler ausgeben würde. Das Wort assert war ja vorher kein Schlüsselwort.
- Um die Assertion einzuschalten, damit sie die assert-Anweisung benutzen zu können, müssen Sie beim Komplieren das auch explizit angeben:
javac -source 1.4 MeineKlasse.java - Die Assertions sind zuerst deaktiviert, bis sie mit dem folgenden Kommandobefehl aktiviert werden:
Java -enableassertions MeineKlasse - Mit der assert-Anweisung kann der Programmierer Meldungen ausgeben bzw. Anweisungen ausführen, die normaler Weise nicht auftreten könnten. Das hört sich kompliziert an, als es ist. Hier ein Beispiel:
Sie haben ein Objekt, was eigentlich niemals "null" sein könnte. Hier geben Sie die folgende Zeile ein:
assert meinObjekt != null : "dieses Objekt sollte eigentlich nicht NULL sein!";
Falls dieses Objekt den Wert null haben sollte, bekommen Sie die oben angegebene Meldung, so dass Sie hier Vorkehrungen treffen können - Bei der Verwendung von assert-Anweisung treten keine Laufzeitverluste auf, weil per Voreinstellung die Zusicherungen deaktiviert sind.