Wie man Java-Ausnahmen richtig handhabt
Als Neuling in der Programmierung So lernen Sie das Programmieren ohne all den Stress Wie lernen Sie das Programmieren ohne all den Stress? Vielleicht haben Sie sich entschieden, das Programmieren zu beginnen, ob für eine Karriere oder nur als Hobby. Großartig! Aber vielleicht fangen Sie an, sich überfordert zu fühlen. Nicht so toll. Hier finden Sie Hilfe, um Ihre Reise zu erleichtern. Lesen Sie mehr, das Konzept von Ausnahmebehandlung Es kann schwierig sein, den Kopf zu umwickeln. Nicht dass das Konzept selbst schwierig ist, aber die Terminologie lässt es fortgeschrittener erscheinen, als es ist. Und es ist ein so mächtiges Feature, dass es anfällig für Missbrauch und Missbrauch ist.
In diesem Artikel erfahren Sie, welche Ausnahmen es gibt, warum sie wichtig sind, wie sie verwendet werden, und häufige Fehler, die vermieden werden sollen. Die meisten modernen Sprachen 6 Einfachste Programmiersprachen zum Erlernen für Anfänger 6 Einfachste Programmiersprachen zum Erlernen für Anfänger Beim Programmieren lernen Sie, die richtige Sprache zu finden, ebenso wie den Erbauungsprozess. Hier sind die sechs einfachsten Programmiersprachen für Anfänger. Lesen Sie mehr über eine Art Ausnahmebehandlung. Wenn Sie also von Java fortfahren, sollten Sie 7 weitere nützliche Tricks zum Beherrschen einer neuen Programmiersprache verwenden. Sie werden die Dinge wahrscheinlich so schnell vergessen, wie Sie sie lernen. Diese Tipps helfen Ihnen dabei, all diese neuen Informationen besser aufzubewahren. Lesen Sie weiter, Sie können die meisten dieser Tipps mitnehmen.
Grundlegendes zu Java-Ausnahmen
In Java ein Ausnahme ist ein Objekt, das auf etwas Ungewöhnliches hinweist (oder “außergewöhnlich”) trat während der Ausführung Ihrer Anwendung auf. Solche Ausnahmen sind geworfen, Dies bedeutet im Wesentlichen, dass ein Ausnahmeobjekt erstellt wird (ähnlich wie Fehler auftreten “angehoben”).
Das Schöne ist, dass du kannst Fang Ausnahmen ausgelöst, mit denen Sie mit dem anormalen Zustand fertig werden und Ihre Anwendung weiterlaufen kann, als ob nichts schiefgelaufen wäre. Während beispielsweise ein Nullzeiger in C Ihre Anwendung zum Absturz bringen kann, können Sie mit Java werfen und abfangen NullPointerException
s, bevor eine Nullvariable einen Absturz verursachen kann.
Denken Sie daran, dass eine Ausnahme nur ein Objekt ist, jedoch mit einem wichtigen Merkmal: Sie muss von der Erweiterung aus erweitert werden Ausnahme
Klasse oder eine Unterklasse von Ausnahme
. Java verfügt zwar über alle integrierten Ausnahmen, Sie können aber auch eigene Ausnahmen erstellen. Zu den häufigsten Java-Ausnahmen gehören:
NullPointerException
NumberFormatException
IllegalArgumentException
RuntimeException
Illegale staatliche Ausnahme
Was passiert also, wenn Sie eine Ausnahme auslösen??
Zunächst sucht Java in der unmittelbaren Methode, ob Code vorhanden ist, der die Art der Ausnahme behandelt, die Sie ausgelöst haben. Wenn kein Handler vorhanden ist, wird nach der Methode gesucht, die die aktuelle Methode aufgerufen hat, um festzustellen, ob dort ein Handle vorhanden ist. Wenn nicht, wird die aufgerufene Methode betrachtet Das Methode und dann die nächste Methode usw. Wenn die Ausnahme nicht abgefangen wird, druckt die Anwendung eine Stapelablaufverfolgung und stürzt dann ab. (Eigentlich ist es mehr nuanciert als einfach abstürzen, aber das ist ein fortgeschrittenes Thema, das über den Umfang dieses Artikels hinausgeht.)
EIN Stapelverfolgung ist eine Liste aller Methoden, die Java während der Suche nach einem Exception-Handler durchlaufen hat. So sieht ein Stack-Trace aus:
Ausnahme im Thread "main" java.lang.NullPointerException bei com.example.myproject.Book.getTitle (Book.java:16) bei com.example.myproject.Author.getBookTitles (Author.java:25) bei com.example. myproject.Bootstrap.main (Bootstrap.java:14)
Daraus können wir viel ablesen. Erstens war die geworfene Ausnahme a NullPointerException
. Es ist im vorgekommen getTitle ()
Methode in Zeile 16 von Book.java. Diese Methode wurde von aufgerufen getBookTitles ()
in Zeile 25 von Author.java. Das Methode wurde von aufgerufen Main()
in Zeile 14 von Bootstrap.java. Wie Sie sehen, erleichtert das Wissen all dies das Debuggen.
Aber der wahre Vorteil von Ausnahmen ist, dass Sie es können “Griff” den anormalen Zustand, indem Sie die Ausnahme abfangen, die Dinge richtig stellen und die Anwendung fortsetzen, ohne abzustürzen.
Java-Ausnahmen im Code verwenden
Lass uns sagen, du hast someMethod ()
Das nimmt eine ganze Zahl und führt eine Logik aus, die unterbrechen könnte, wenn die ganze Zahl kleiner als 0 oder größer als 100 ist. Dies könnte ein guter Ort sein, um eine Ausnahme auszulösen:
public void someMethod (int value) if (wert < 0 || value > 100) werfen neu IllegalArgumentException
(); //…
Um diese Ausnahme abzufangen, müssen Sie wo gehen someMethod ()
wird aufgerufen und benutzt die Try-Catch-Block:
public void callingMethod () try someMethod (200); someOtherMethod (); catch (IllegalArgumentException e) // behandelt die Ausnahme hier //…
Alles innerhalb der Versuchen Der Block wird der Reihe nach ausgeführt, bis eine Ausnahme ausgelöst wird. Sobald eine Ausnahme ausgelöst wird, werden alle nachfolgenden Anweisungen übersprungen und die Anwendungslogik springt sofort auf Fang Block.
In unserem Beispiel geben wir den try-Block ein und rufen sofort an someMethod ()
. Da 200 nicht zwischen 0 und 100 ist, eine IllegalArgumentException
ist geworfen. Dies beendet sofort die Ausführung von someMethod ()
, Überspringt den Rest der Logik im try-Block (someOtherMethod ()
wird nie aufgerufen) und setzt die Ausführung innerhalb des catch-Blocks fort.
Was würde passieren, wenn wir anrufen würden someMethod (50)
stattdessen? Das IllegalArgumentException
würde niemals geworfen werden. someMethod ()
würde als normal ausführen. Der try-Block würde wie gewohnt aufrufend ausgeführt someOtherMethod ()
wenn someMethod () abgeschlossen ist. Wann someOtherMethod ()
endet, wird der Fangblock übersprungen und Aufrufmethode ()
würde fortfahren.
Beachten Sie, dass Sie pro Try-Block mehrere catch-Blöcke haben können:
public void callingMethod () try someMethod (200); someOtherMethod (); catch (IllegalArgumentException e) // behandelt die Ausnahme hier (nullPointerException e) // behandelt die Ausnahme hier //…
Beachten Sie auch, dass dies optional ist endlich Block existiert auch:
public void method () try //… catch (Ausnahme e) //… schließlich //…
Der Code innerhalb eines finally-Blocks lautet immer ausgeführt, egal was. Wenn Sie im try-Block eine return-Anweisung haben, wird der finally-Block ausgeführt, bevor Sie die Methode verlassen. Wenn Sie eine weitere Ausnahme in den catch-Block werfen, wird der finally-Block ausgeführt, bevor die Ausnahme ausgelöst wird.
Sie sollten den finally-Block verwenden, wenn Objekte vorhanden sind, die bereinigt werden müssen, bevor die Methode endet. Wenn Sie beispielsweise eine Datei im try-Block geöffnet haben und später eine Ausnahme ausgelöst haben, können Sie mit dem finally-Block die Datei schließen, bevor Sie die Methode verlassen.
Beachten Sie, dass Sie einen finally-Block ohne catch-Block haben können:
public void method () try //… schließlich //…
Auf diese Weise können Sie alle erforderlichen Bereinigungen durchführen und gleichzeitig zulassen, dass ausgelöste Ausnahmen den Methodenaufrufstapel verbreiten (d. H. Sie möchten die Ausnahme hier nicht behandeln, müssen jedoch zuerst bereinigen)..
Geprüfte vs. ungeprüfte Ausnahmen in Java
Im Gegensatz zu den meisten Sprachen unterscheidet Java zwischen geprüfte Ausnahmen und ungeprüfte Ausnahmen (z. B. hat C # nur ungeprüfte Ausnahmen). Eine geprüfte Ausnahme Muss in der Methode abgefangen werden, in der die Ausnahme ausgelöst wird, andernfalls wird der Code nicht kompiliert.
Um eine geprüfte Ausnahme zu erstellen, erweitern Sie von Ausnahme
. Um eine ungeprüfte Ausnahme zu erstellen, erweitern Sie von RuntimeException
.
Jede Methode, die eine geprüfte Ausnahme auslöst, muss dies in der Methodensignatur mit der wirft Stichwort. Seit Java eingebaut IOException
ist eine geprüfte Ausnahme, der folgende Code wird nicht kompiliert:
public void wontCompile () //… if (someCondition) werfen neue IOException (); //…
Sie müssen zuerst erklären, dass eine geprüfte Ausnahme ausgelöst wird:
public void willCompile () wirft IOException //… if (someCondition) werfen neue IOException (); //…
Beachten Sie, dass eine Methode als Auslösung einer Ausnahme deklariert werden kann, aber niemals eine Ausnahme auslösen kann. Trotzdem muss die Ausnahme weiterhin abgefangen werden, andernfalls wird der Code nicht kompiliert.
Wann sollten Sie markierte oder ungeprüfte Ausnahmen verwenden??
Die offizielle Java-Dokumentation enthält eine Seite zu dieser Frage. Es fasst den Unterschied mit einer kurzen Faustregel zusammen: “Wenn von einem Client vernünftigerweise erwartet werden kann, dass er sich von einer Ausnahme erholt, machen Sie ihn zu einer geprüften Ausnahme. Wenn ein Client nichts aus der Ausnahme wiederherstellen kann, machen Sie ihn zu einer ungeprüften Ausnahme.”
Diese Richtlinie kann jedoch veraltet sein. Auf der einen Seite führen geprüfte Ausnahmen zu robusterem Code. 10 Tipps für das Schreiben von Cleaner und besserem Code 10 Tipps für das Schreiben von Cleaner und besserem Code Das Schreiben von sauberem Code sieht zwar einfacher aus als es tatsächlich ist, aber die Vorteile sind es wert. So können Sie heute saubereren Code schreiben. Weiterlesen . Auf der anderen Seite hat keine andere Sprache Ausnahmen auf dieselbe Weise geprüft wie Java, was zwei Dinge zeigt: Erstens ist die Funktion für andere Sprachen nicht nützlich genug, um sie zu stehlen, und zweitens können Sie ohne sie leben. Außerdem können geprüfte Ausnahmen nicht gut mit in Java 8 eingeführten Lambda-Ausdrücken funktionieren.
Richtlinien für die Verwendung von Java-Ausnahmen
Ausnahmen sind nützlich, können aber leicht missbraucht und missbraucht werden. Im Folgenden finden Sie einige Tipps und bewährte Vorgehensweisen, mit deren Hilfe Sie vermeiden können, dass diese Probleme entstehen.
- Bevorzugen Sie bestimmte Ausnahmen von allgemeinen Ausnahmen. Benutzen
NumberFormatException
ÜberIllegalArgumentException
wenn möglich, sonst verwendenIllegalArgumentException
ÜberRuntimeException
wenn möglich. - Niemals fangen
Wurffähig
! DasAusnahme
Klasse erstreckt sich tatsächlichWurffähig
, und der catch-Block arbeitet tatsächlich mitWurffähig
oder jede Klasse, die Throwable erweitert. Jedoch dieError
Klasse erstreckt sich auchWurffähig
, und du willst nie ein fangenError
daError
s weisen auf schwerwiegende, nicht behebbare Probleme hin. - Niemals fangen
Ausnahme
!InterruptedException
erweitertAusnahme
, also jeder Block, der fängtAusnahme
werde auch fangenInterruptedException
, Dies ist eine sehr wichtige Ausnahme, mit der Sie sich (insbesondere in Multithread-Anwendungen) nicht befassen möchten, es sei denn, Sie wissen, was Sie tun. Wenn Sie nicht wissen, welche Ausnahme abgefangen werden soll, sollten Sie nichts erwischen. - Verwenden Sie beschreibende Meldungen, um das Debugging zu erleichtern. Wenn Sie eine Ausnahme auslösen, können Sie eine angeben
String
Nachricht als Argument. Auf diese Nachricht kann im catch-Block mit der Taste zugegriffen werdenException.getMessage ()
Wenn jedoch die Ausnahme nie abgefangen wird, wird die Nachricht auch als Teil des Stack-Trace angezeigt. - Versuchen Sie nicht, Ausnahmen zu fangen und zu ignorieren. Um die Unannehmlichkeiten von geprüften Ausnahmen zu umgehen, werden viele Neulinge und faule Programmierer einen catch-Block einrichten, der jedoch leer bleibt. Schlecht! Behandeln Sie es immer vorsichtig, aber wenn Sie dies nicht können, drucken Sie mindestens eine Stapelablaufverfolgung aus, damit Sie wissen, dass die Ausnahme ausgelöst wurde. Sie können dies mit der
Exception.printStackTrace ()
Methode. - Hüten Sie sich vor übermäßigen Ausnahmen. Wenn Sie einen Hammer haben, sieht alles wie ein Nagel aus. Wenn Sie zum ersten Mal etwas über Ausnahmen erfahren, fühlen Sie sich möglicherweise gezwungen, alles zu einer Ausnahme zu machen ... bis zu dem Punkt, an dem der Steuerfluss Ihrer Anwendung hauptsächlich auf die Behandlung von Ausnahmen zurückzuführen ist. Denken Sie daran, Ausnahmen sind für gedacht “außergewöhnlich” Vorkommen!
Nun sollten Sie mit Ausnahmen vertraut sein, um zu verstehen, was sie sind, warum sie verwendet werden und wie Sie sie in Ihren eigenen Code integrieren. Wenn Sie das Konzept nicht vollständig verstehen, ist das in Ordnung! Ich habe eine Weile gebraucht, bis es so war “klicken” in meinem Kopf, so fühlen Sie sich nicht so, als müssten Sie es eilig haben 6 Zeichen, dass Sie nicht als Programmierer gedacht sind 6 Zeichen, dass Sie nicht als Programmierer gedacht sind Nicht jeder ist dazu bestimmt, Programmierer zu sein. Wenn Sie nicht ganz sicher sind, ob Sie ein Programmierer sein sollen, finden Sie hier einige Hinweise, die möglicherweise in die richtige Richtung weisen. Weiterlesen . Nimm dir Zeit.
Fragen? Kennen Sie weitere Ausnahmetipps, die ich vermisst habe? Teilen Sie sie in den Kommentaren unten mit!
Erfahren Sie mehr über: Java.