In der Java-Sprache werden Ausnahmen in zwei Kategorien unterteilt:
Geprüfte Ausnahme: Diese Art von Ausnahme muss explizit in der throws-Klausel ausgelöst oder innerhalb der Methode abgefangen werden. Zum Beispiel IOException oder ClassNotFoundException.
Ungeprüfte Ausnahme: Diese Art von Ausnahme muss nicht explizit ausgelöst oder abgefangen werden. Beispiel: NumberFormatException.
Wenn in der run()-Methode eines Thread-Objekts eine geprüfte Ausnahme ausgelöst wird, müssen wir sie abfangen und behandeln, da die run()-Methode keine Ausnahmen auslösen kann. Wenn in der run()-Methode des Thread-Objekts eine ungeprüfte Ausnahme ausgelöst wird, besteht das Standardverhalten darin, die Stack-Trace-Informationen auf der Konsole auszugeben und dann das Programm zu beenden.
Glücklicherweise stellt uns Java einen Mechanismus zur Verfügung, der speziell darauf ausgelegt ist, ungeprüfte Ausnahmen zu verarbeiten, die von Thread-Objekten ausgelöst werden, um ein Beenden des Programms zu verhindern.
In diesem Abschnitt verwenden wir ein Beispiel, um diesen Mechanismus zu demonstrieren.
weiß es
Befolgen Sie die unten gezeigten Schritte, um unser Beispiel umzusetzen.
1. Zuerst müssen wir eine Klasse zur Behandlung ungeprüfter Ausnahmen implementieren. Diese Klasse muss die UncaughtExceptionHandler-Klasse und die in dieser Schnittstelle deklarierte uncaughtException()-Methode implementieren. In diesem Beispiel lautet der Klassenname ExceptionHandler und die Methode uncaughtException() gibt die Ausnahme und die Thread-Informationen aus, die die Ausnahme ausgelöst haben. Der Code lautet wie folgt:
Kopieren Sie den Codecode wie folgt:
Die öffentliche Klasse ExceptionHandler implementiert Thread.UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.printf("Eine Ausnahme wurde erfasst//n");
System.out.printf("Thread: %s/n", t.getId());
System.out.printf("Ausnahme: %s: %s/n", e.getClass().getName(),
e.getMessage());
System.out.printf("Stack Trace: /n");
e.printStackTrace(System.out);
System.out.printf("Thread-Status: %s/n", t.getState());
}
}
2. Implementieren Sie eine Klasse namens Task, die ungeprüfte Ausnahmen auslösen kann, implementieren Sie die Runnable-Schnittstelle, implementieren Sie die run()-Methode und codieren Sie speziell einen Code, der ungeprüfte Ausnahmen generieren kann, z. B. eine Zeichenfolge in eine Zahl umwandeln. Der Code lautet wie folgt:
Kopieren Sie den Codecode wie folgt:
öffentliche Klasse Task implementiert Runnable {
@Override
public void run() {
int numero = Integer.parseInt("diguage.com");
}
}
3. Erstellen Sie die Hauptklasse des Programms, die Main-Klasse, und implementieren Sie dann die main()-Methode. Der Code lautet wie folgt:
Kopieren Sie den Codecode wie folgt:
öffentliche Klasse Main {
public static void main(String[] args) {
4. Erstellen Sie ein Task-Objekt und ein Thread-Objekt, um es auszuführen. Verwenden Sie die Methode setUncaughtExceptionHandler(), um die Behandlungsklasse für ungeprüfte Ausnahmen festzulegen. Dann starten Sie den Thread. Der Code lautet wie folgt:
Kopieren Sie den Codecode wie folgt:
Aufgabe task = new Task();
Thread thread = neuer Thread(Aufgabe);
thread.setUncaughtExceptionHandler(new ExceptionHandler());
thread.start();
5. Führen Sie das Beispiel aus und sehen Sie sich die Ergebnisse an.
weiß warum
Das Ergebnis der abnormalen Ausführung ist aus dem folgenden Ausgabeausschnitt ersichtlich. Die Ausnahme wird ausgelöst, dann von der Handler-Klasse abgefangen und die Ausnahmeinformationen werden auf der Konsole ausgegeben.
Kopieren Sie den Codecode wie folgt:
Eine Ausnahme wurde erfasst
Thema: 9
Ausnahme: java.lang.NumberFormatException: Für Eingabezeichenfolge: „diguage.com“
Stack-Trace:
java.lang.NumberFormatException: Für Eingabezeichenfolge: „diguage.com“
bei java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
bei java.lang.Integer.parseInt(Integer.java:492)
bei java.lang.Integer.parseInt(Integer.java:527)
unter com.diguage.books.concurrencycookbook.chapter1.recipe8.Task.run(Task.java:13)
bei java.lang.Thread.run(Thread.java:722)
Thread-Status: RUNNABLE
Prozess mit Exit-Code 0 beendet
Wenn ein Thread eine Ausnahme auslöst und die Ausnahme (hier speziell eine ungeprüfte Ausnahme) nicht abgefangen wird, prüft die Java Virtual Machine, ob die ungeprüfte Ausnahmebehandlungsklasse über die entsprechende Methode festgelegt wurde und übergeben Sie den Thread und die Ausnahme als Parameter an die Methode.
Wenn keine Verarbeitungsklasse festgelegt ist, gibt die Java Virtual Machine die Stack-Trace-Informationen auf der Konsole aus und beendet dann das Programm.
niemals enden
Die Thread-Klasse verfügt außerdem über eine Methode zur ungeprüften Ausnahmebehandlung. Dies ist die statische Methode setDefaultUncaughtExceptionHandler(), die die ungeprüfte Ausnahmebehandlungsklasse für alle Threads im Programm festlegen kann.
Wenn in einem Thread eine nicht abgefangene Ausnahme ausgelöst wird, sucht die Java Virtual Machine an drei Stellen nach Ausnahmebehandlungsklassen:
Suchen Sie zunächst nach der Ausnahmebehandlungsklasse im Thread-Objekt. Das haben wir in diesem Abschnitt gelernt. Wenn sie nicht vorhanden ist, wird die Ausnahmebehandlungsklasse in der Thread-Gruppe (ThreadGroup) gesucht, in der sich der Thread befindet. Dieser Teil wird später speziell erläutert. Wenn sie immer noch nicht vorhanden ist, suchen Sie nach der oben erwähnten Standard-Ausnahmebehandlungsklasse des Programms.
Wenn keiner der oben genannten Ausnahmehandler vorhanden ist, gibt die Java Virtual Machine die Stack-Trace-Informationen der Ausnahme auf der Konsole aus und beendet dann das Programm.
Nutzen Sie die Lehre
Dieser Artikel wurde aus dem „Java 7 Concurrency Cookbook“ übersetzt (D Gua Ge hat ihn als „Java7 Concurrency Beispielsammlung“ gestohlen) und dient nur als Lernmaterial. Es darf ohne Genehmigung nicht für kommerzielle Zwecke verwendet werden.
Kleiner Erfolg
Der vollständige Code der ExceptionHandler-Klasse lautet wie folgt:
Paket com.diguage.books.concurrencycookbook.chapter1.recipe8;
/**
* Ungeprüfte Ausnahmebehandlungsklasse
* Datum: 22.09.2013
* Zeit: 23:11
*/
Die öffentliche Klasse ExceptionHandler implementiert Thread.UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.printf("Eine Ausnahme wurde erfasst/n");
System.out.printf("Thread: %s/n", t.getId());
System.out.printf("Ausnahme: %s: %s/n", e.getClass().getName(),
e.getMessage());
System.out.printf("Stack Trace: /n");
e.printStackTrace(System.out);
System.out.printf("Thread-Status: %s/n", t.getState());
}
}
Vollständiger Code der Task-Klasse
Kopieren Sie den Codecode wie folgt:
Paket com.diguage.books.concurrencycookbook.chapter1.recipe8;
/**
* Ausnahmegenerierungsklasse
* Datum: 22.09.2013
* Zeit: 23:18
*/
öffentliche Klasse Task implementiert Runnable {
@Override
public void run() {
int numero = Integer.parseInt("diguage.com");
}
}
Der vollständige Code der Hauptklasse
Kopieren Sie den Codecode wie folgt:
Paket com.diguage.books.concurrencycookbook.chapter1.recipe8;
/**
* Hauptklasse des Beispiels
* Datum: 22.09.2013
* Zeit: 23:20
*/
öffentliche Klasse Main {
public static void main(String[] args) {
Aufgabe task = new Task();
Thread thread = neuer Thread(Aufgabe);
thread.setUncaughtExceptionHandler(new ExceptionHandler());
thread.start();
}
}