Es ist schwierig, ein Programm perfekt zu machen, und es kommt zwangsläufig zu verschiedenen Anomalien. Beispielsweise liegt ein Fehler im Programm selbst vor, z. B. wenn dem Drucker beim Drucken das Papier ausgeht oder nicht genügend Speicher vorhanden ist. Um diese Ausnahmen zu lösen, müssen wir wissen, warum die Ausnahme aufgetreten ist. Für einige häufige Ausnahmen können wir auch bestimmte Reaktionspläne bereitstellen. Die Ausnahmebehandlung in der Sprache C wird einfach durch Funktionsrückgabewerte implementiert, die Bedeutung des Rückgabewerts wird jedoch häufig durch Konventionen bestimmt. Programmierer müssen eine große Menge an Informationen abfragen, bevor sie einen vagen Grund finden können. Objektorientierte Sprachen wie C++, Java und Python verfügen häufig über komplexere Mechanismen zur Ausnahmebehandlung. Der Ausnahmebehandlungsmechanismus in Java wird hier erläutert.
Java-Ausnahmebehandlung
Ausnahmebehandlung
Ein großer Teil des Ausnahmebehandlungsmechanismus von Java stammt aus C++. Es ermöglicht Programmierern, Probleme, die vorübergehend nicht behandelt werden können, zu überspringen, um die spätere Entwicklung fortzusetzen, oder es dem Programm zu ermöglichen, Ausnahmen intelligenter zu behandeln.
Java verwendet einige spezielle Objekte, um abnormale Bedingungen darzustellen. Solche Objekte werden Ausnahmeobjekte genannt. Wenn eine Ausnahme auftritt, wirft Java basierend auf voreingestellten Einstellungen ein Objekt aus, das die aktuelle Situation darstellt. Das sogenannte Werfen ist eine besondere Art der Rückführung. Der Thread hält die Methodenaufrufe Schicht für Schicht an und beendet sie, bis er auf einen Ausnahmehandler trifft. Der Ausnahmebehandler kann das Ausnahmeobjekt abfangen und basierend auf dem Objekt über die nächste Aktion entscheiden, z. B.:
Erinnern Sie den Benutzer daran, Ausnahmen zu behandeln und das Programm fortzusetzen, um das Programm zu beenden
...
Der Ausnahmehandler sieht so aus, er besteht aus try, Catch, final und den folgenden Blöcken. ist schließlich nicht erforderlich.
try { ...;}catch() { ...;}catch() { ...;}finally { ...;}
Dieser Ausnahmebehandler überwacht den Programmblock nach dem Versuch. Die Catch-Klammern verfügen über einen Parameter, der den Typ der abzufangenden Ausnahme darstellt. Catch erfasst den entsprechenden Typ und seine abgeleiteten Klassen. Der Programmblock nach try enthält die auszuführenden Operationen für den Ausnahmetyp. Der von try überwachte Programmblock kann mehr als einen Ausnahmetyp auslösen, sodass ein Ausnahmehandler mehrere Catch-Module haben kann. Der Programmblock nach „finally“ ist ein Programm, das unabhängig davon ausgeführt werden muss, ob eine Ausnahme auftritt.
Wir platzieren Programme, die möglicherweise schiefgehen und überwacht werden müssen, in „try“ und entwickeln Lösungen für den Umgang mit Ausnahmen in „catch“.
Das Folgende ist ein Teil eines Java-Programms, das die Ausnahmebehandlung verwendet. Der Try-Teil des Programms liest Textzeilen aus einer Datei. Während des Lesevorgangs der Datei kann eine IOException auftreten:
BufferedReader br = new BufferedReader(new FileReader("file.txt"));try { StringBuilder sb = new StringBuilder(); String line = br.readLine(); while (line != null) { sb.append(line) ; sb.append("/n"); line = br.readLine( } String everything = sb.toString();} Catch(IOException e) { e.printStackTrace(); System.out.println("IO problem");}finally { br.close();}
Wenn wir das IOException-Klassenobjekt e abfangen, können wir das Objekt bearbeiten. Rufen Sie beispielsweise printStackTrace() des Objekts auf, um den aktuellen Stapelstatus zu drucken. Darüber hinaus haben wir auch die Eingabeaufforderung „IO-Problem“ im mittleren Bereich gedruckt.
Unabhängig davon, ob eine Ausnahme vorliegt oder nicht, wird das Programm schließlich in den endgültigen Block eintreten. Wir schließen die Datei im „finally“-Block und löschen die vom Dateideskriptor belegten Ressourcen.
Ausnahmetyp
Ausnahmeklassen in Java erben alle von der Trowable-Klasse. Ein Objekt der Throwable-Klasse kann geworfen (geworfen) werden.
Orange: deaktiviert; blau: aktiviert
Wurfgegenstände können in zwei Gruppen eingeteilt werden. Eine Gruppe sind ungeprüfte Ausnahmen. Für diese Ausnahmegruppe werden häufig keine Mechanismen zur Ausnahmebehandlung verwendet, darunter:
1. Die Fehlerklasse bezieht sich normalerweise auf Javas interne Fehler und Fehler wie Ressourcenerschöpfung. Wenn ein Fehler (und seine Ableitungen) auftritt, können wir den Fehler nicht auf Programmierebene beheben, daher sollten wir das Programm direkt verlassen.
2. Die Exception-Klasse verfügt über eine spezielle abgeleitete Klasse RuntimeException. RuntimeException (und ihre Derivate) werden durch das Java-Programm selbst verursacht, d. h. durch Fehler des Programmierers beim Programmieren. RuntimeException kann durch eine Änderung des Java-Programms vollständig vermieden werden. Beispielsweise ist die Konvertierung eines Objekts eines Typs in einen anderen Typ ohne Vererbungsbeziehung eine ClassCastException. Solche Anomalien sollten und können vermieden werden.
Der Rest sind geprüfte Ausnahmen. Diese Klassen werden durch Programmierinteraktionen mit der Umgebung verursacht, die zur Laufzeit Fehler im Programm verursachen. Beim Lesen einer Datei kommt es beispielsweise aufgrund eines Fehlers in der Datei selbst zu einer IOException. Ein weiteres Beispiel ist, dass der Netzwerkserver vorübergehend die URL-Verweisung ändert, was zu einer MalformedURLException führt. Das Dateisystem und der Netzwerkserver befinden sich außerhalb der Java-Umgebung und unterliegen nicht der Kontrolle des Programmierers. Wenn Programmierer Ausnahmen vorhersehen können, können sie den Ausnahmebehandlungsmechanismus verwenden, um Reaktionspläne zu entwickeln. Wenn beispielsweise ein Problem mit einer Datei auftritt, wird der Systemadministrator benachrichtigt. Ein weiteres Beispiel wäre, dass der Benutzer bei einem Problem mit dem Netzwerkserver daran erinnert wird und auf die Wiederherstellung des Netzwerkservers wartet. Der Ausnahmebehandlungsmechanismus wird hauptsächlich zur Behandlung solcher Ausnahmen verwendet.
eine Ausnahme auslösen
Im obigen Programm kommt die Ausnahme von unserem Aufruf der Java IO API. Wir können auch Ausnahmen in unseren eigenen Programmen auslösen, beispielsweise in der folgenden Batterieklasse, die über Lade- und Nutzungsmethoden verfügt:
public class Test{ public static void main(String[] args) { Battery aBattery = new Battery(); aBattery.chargeBattery(-0.5); / public void chargeBattery(double p) { // power <= 1 if (this.power + p < 1.) { this.power = this.power + p; } else { this.power = 1.; } } /** * verbrauchen Batterie */ public boolean useBattery(double p) { try { test(p } Catch(Exception e) { System. out.println("catch Exception"); System.out.println(e.getMessage()); p = 0.0; } if (this.power >= p) { this.power = this.power - p; return true; } else { this.power = 0.0; return false } } /** * test use */ private void test(double p) throws Exception // Ich werfe nur { if ( p < 0) { Exception e = new Exception("p muss positiv sein"); private double power = 0.0;
useBattery() gibt an, dass der Batteriebetrieb verwendet wird. In der Methode useBattery() gibt es einen Parameter, der die verbrauchte Strommenge angibt. Wir verwenden die Methode test(), um diesen Parameter zu testen. Wenn dieser Parameter negativ ist, gehen wir davon aus, dass eine Ausnahme vorliegt, und werfen sie aus.
Wenn im Test eine Ausnahme auftritt (p < 0), erstellen wir ein Ausnahmeobjekt e und verwenden eine Zeichenfolge als Parameter. Die Zeichenfolge enthält ausnahmebezogene Informationen und dieser Parameter ist nicht erforderlich. Verwenden Sie throw, um das Exception-Objekt auszulösen.
Wir haben einen Ausnahmehandler in useBattery(). Da die test()-Methode die von ihr generierte Ausnahme nicht direkt verarbeitet, sondern die Ausnahme an die obere useBattery() wirft, müssen wir throws Exception in der Definition von test() erklären.
(Angenommen, der Ausnahmehandler befindet sich nicht in useBattery(), sondern in der übergeordneten main()-Methode, müssen wir auch throws Exception zur Definition von useBattery() hinzufügen.)
In Catch verwenden wir die Methode getMessage(), um die in ihrer Ausnahme enthaltenen Informationen zu extrahieren. Die Ergebnisse der Ausführung des obigen Programms sind wie folgt:
Catch Exceptionp muss positiv sein
Im Ausnahmebehandler fangen wir jede Ausnahme der Exception-Klasse oder ihrer Derivate ab. Dies hilft uns oft nicht dabei, Probleme zu identifizieren, insbesondere wenn ein Programm möglicherweise mehrere Ausnahmen auslöst. Wir können eine spezifischere Klasse zur Erfassung bereitstellen.
Benutzerdefinierte Ausnahme
Durch Vererbung können wir neue Ausnahmeklassen erstellen. Bei der Vererbung müssen wir häufig den Konstruktor überschreiben. Ausnahmen haben zwei Konstruktoren, einen ohne Parameter und einen mit einem String-Parameter. Zum Beispiel:
class BatteryUsageException erweitert die Ausnahme{ public BatteryUsageException() {} public BatteryUsageException(String msg) { super(msg }}
Wir können in abgeleiteten Klassen weitere ausnahmebezogene Methoden und Informationen bereitstellen.
Achten Sie beim Anpassen von Ausnahmen darauf, von welcher Basisklasse Sie erben. Eine spezifischere Klasse sollte mehr Ausnahmeinformationen enthalten, z. B. IOException versus Exception.
Zusammenfassen
Die Ausnahmebehandlung löst Probleme, schafft aber auch Probleme. In großen Projekten führt eine übermäßige und detaillierte Ausnahmebehandlung häufig dazu, dass das Programm durcheinander gerät. Die Ausnahmebehandlung ist von Natur aus nicht einfach und muss mit Vorsicht angewendet werden.