Ausnahmen

Werbung
Ausnahmenbehandlung in Java
Dr. Horst Treiblmaier
Abteilung für Wirtschaftsinformatik
WU Wien
Was sind Exceptions?
n
n
n
Eine Ausnahme (Exception) ist ein Objekt
einer Unterklasse von Throwable
Eine Ausnahme tritt dann auf, wenn bei der
Programmausführung eine semantische Regel
verletzt wird. (z.B. x[-4], Division durch 0)
In manchen Fällen kann man Exceptions
durch if ... else abfangen, allerdings ergibt
sich daraus ein hoher Programmieraufwand
Exception Handling
n
n
n
Zur Laufzeit wird eine Ausnahme erzeugt die
in einem Ausnahmebehandler (Exception
Handler) aufgefangen und bearbeitet wird
Ein Block um alle "kritischen Stellen" reicht
Nach einem Sprung in den
Ausnahmebehandler wird nicht mehr
zurückgesprungen
Beispiel 1
public class Exception1 {
public static void main (String args[]) {
int[] feld = new int[100];
for (int i=0; i<=99; i++) {
feld[i] = i;
}
Zuweisung
for (int i = 0; i <= 99; i++) {
System.out.println("i = " + feld[i]);
}
}
}
Ausgabe
Beispiel 1
public class Exception2 {
public static void main (String args[]) {
int[] feld = new int[100];
for (int i=0; i<=99; i++) {
feld[i] = i;
}
Fehler
for (int i = 0; i <= 100; i++) {
System.out.println("i = " + feld[i]);
}
}
}
Der Interpreter (nicht der Compiler!) bricht die Ausführung ab
Beispiel 1
public class Exception3 {
public static void main (String args[]) {
int[] feld = new int[100];
try {
for (int i=0; i<=99; i++) {
feld[i] = i;
}
try-Block
for (int i = 0; i <= 100; i++) {
System.out.println("i = " + feld[i]);
}
catch-Block
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("Fehler!");
}
System.out.println("Hier geht es ganz normal weiter");
}
}
Das Programm wird ausgeführt!
ExceptionBeispiel1 Angabe
Aufgabe: Schreiben Sie ein Programm "ExceptionBeispiel1"
das in einer for-Schleife mit einer int-Zählvariablen von 10
bis –10 rückwärts zählt. In der Schleife wird die Zahl 100
durch den Zählwert dividiert und ausgegeben. Um die
Division durch Null abzufangen verwenden Sie die
Ausnahme "ArithmeticException".
ExceptionBeispiel1 Lösung
public class ExceptionBeispiel1 {
public static void main (String args[]) {
try {
for (int i = 10; i >= -10; i--) {
System.out.println(100/i);
}
}
catch (ArithmeticException e) {
System.out.println("Das geht nicht");
}
}
}
Eigene Exceptions (1)
public class MyException extends
java.lang.Throwable {
}
Die Superklasse der Klassen Error und Exception
Mit diesem Schritt erzeuge ich eine
eigene Fehlerklasse MyException
Eigene Exceptions (2)
public class ExceptionTest {
public static void main(String args[]) {
System.out.print("So ");
try {
System.out.print("ist ");
throw new MyException();
}
catch (MyException m) {
Abfangen der Exception
System.out.print("der ");
}
System.out.print("Ablauf ");
}
}
Aufwurf der Exception und
Suche nach Ausnahmenbehandler
ExceptionBeispiel2 Angabe
Aufgabe: Schreiben Sie eine Exception-Klasse
MeineAusnahme die eine Methode ausgabe() besitzt,
welche "Das ist leider nicht moeglich" ausgibt.
In einer Klasse ExceptionBeispiel2 verwenden sie eine forSchleife die von 1 bis 100 zählt und den jeweiligen Wert
ausgibt. Sobald der Zähler auf 50 kommt soll ihre
"Exception" ausgeworfen werden.
ExceptionBeispiel2 Lösung (1)
public class MeineAusnahme extends java.lang.Throwable {
public void ausgabe() {
System.out.println("Das ist leider nicht moeglich");
}
}
ExceptionBeispiel2 Lösung (2)
public class ExceptionBeispiel2 {
public static void main(String args[]) {
try {
for (int i = 1; i <= 100; i++) {
if (i==50) throw new MeineAusnahme();
}
}
catch (MeineAusnahme m) {
m.ausgabe();
}
}
}
Behandeln von Exceptions
Exceptions müssen mit try...catch entweder selbst behandelt
werden oder mit throws an die aufrufende Methode
weitergeleitet werden.
Beispiel (siehe auch folgende Folie):
public class MyNewException extends java.lang.Throwable {
}
Behandeln von Exceptions
public class ExceptionHierarchy {
public static void main(String args[]) {
method1();
}
static void method1() {
try {
method2();
}
Die
Methode
welche die
Exception
aufwirft
(throw)
muss sie
entweder
selbst
behandeln
(try...catch)
oder
weiterleiten
(throws)
}
catch (MyNewException m) {
System.out.println("Die Methode1 hat einen Fehler aufgefangen");
}
}
static void method2() throws MyNewException{
System.out.println("Hier spricht die Methode2");
method3();
}
static void method3() throws MyNewException {
System.out.println("Hier spricht die Methode3");
if (1 == 1) throw new MyNewException();
}
Weiterleitung der Exception
an die aufrufende Methode
Übungen
1) Löschen Sie im vorherigen Beispiel (ExceptionHierarchy) bei der
Methode 3 die Klausel throws MyNewException. Was passiert?
Machen Sie die Änderung wieder rückgängig.
2) Löschen Sie im bei der Methode 2 die Klausel throws
MyNewException. Was passiert? Machen Sie die Änderung wieder
rückgängig.
3) Entfernen Sie die Ausnahmenbehandlung in der Methode 1 und
versuchen Sie diese ebenfalls weiterzuleiten. Was passiert?
Machen Sie die Änderung wieder rückgängig.
4) Implemetieren Sie die Ausnahmenbehandlung direkt in der
Methode 3
finally und System.err
public class ExceptionBeispiel4 {
public static void main(String args[]) {
method1();
}
static void method1() {
int a = 6;
int b = 2;
int c;
try {
c = a/b;
System.out.println(c);
Standard error stream
}
catch (ArithmeticException ex) {
System.err.println("Divsion durch Null");
Dieser Block wird
auf jeden Fall
ausgeführt
}
}
}
finally
{
System.err.println("Diese Meldung kommt auf jeden Fall");
}
ExceptionBeispiel5 Angabe
Schreiben Sie ein Programm ExceptionBeispiel5 welches die Zahl
10 durch Zufallswerte (int) zwischen –5 und +5 dividiert. Geben
Sie die Ergebnisse aus (int). Falls eine Division durch 0 vorkommt
fangen Sie diese auf und geben Sie "Division durch Null!" aus.
Zusätzlich soll auf jeden Fall "Ende der Ausgabe" erscheinen. Für
die Ausgaben im Fehlerfall benützen Sie den Ausgabestream
System.err.
ExceptionBeispiel5 Lösung
public class ExceptionBeispiel5 {
public static void main(String args[]) {
int dividend = 10;
int divisor;
try {
for (int i = 0; i<10; i++) {
divisor = (int)(Math.random()*11)-5;
System.out.println(dividend/divisor);
}
}
catch (ArithmeticException ex) {
System.err.println("Division durch Null!");
}
finally
{
System.err.println("Ende der Ausgabe");
}
}
}
Die Klasse Exception
public class ExceptionBeispiel6 {
public static void main(String args[]) {
try {
int a = 7/0;
}
catch (Exception e) {
System.err.println("Fehler");
System.err.println("***");
System.err.println(e.getMessage());
System.err.println("***");
System.err.println(e.toString());
System.err.println("***");
Methoden der Klasse Throwable
(Superklasse von Exception)
e.printStackTrace();
System.err.println("***");
System.err.println(e.getClass().getName());
}
}
}
Methode der Klasse Object
Methode der Klasse Class
Herunterladen