Kotlin ist eine moderne Programmiersprache, die Java-Bytecode kompiliert. Es ist kostenlos und Open Source und macht das Kodieren für Android noch mehr Spaß.
Im vorigen Artikel haben Sie mehr über objektorientierte Programmierung erfahren, indem Sie in Kotlin nach abstrakten Klassen, Schnittstellen, Vererbung und Typ-Aliasnamen suchen.
In diesem Beitrag erfahren Sie weiterhin, wie Sie in Kotlin programmieren, indem Sie sich mit Ausnahmen und deren Handhabung vertraut machen.
Ausnahmen werden verwendet, um auf ein Problem in unserem Code während der Programmausführung hinzuweisen. Ausnahmebehandlung ist die Fähigkeit, die möglicherweise auftretende Ausnahme zu behandeln (oder zu behandeln). Wenn wir keine Ausnahme behandeln, hält unser Programm die Ausführung abrupt ab und stürzt sofort ab.
Mit der Ausnahmebehandlung kann unser Programm die Ausführung fortsetzen, auch wenn eine Ausnahmebedingung vorliegt (es wird jedoch dringend empfohlen, Ihre Ausnahmen zu protokollieren und sie mit einem Absturzberichts-Tool wie Crashlytics zu melden)..
In Java gibt es zwei Arten von Ausnahmen: geprüft und nicht geprüft. Ich werde beide kurz erklären, aber wir beginnen mit ungeprüften Ausnahmen.
Dies sind Ausnahmen, die aufgrund von Fehlern in Ihrem Code ausgelöst werden. Sie sind eine direkte oder indirekte Unterklasse der RuntimeException
Oberklasse.
Beispiele für ungeprüfte Ausnahmen sind:
ArithmeticException
: wird geworfen, wenn Sie durch Null teilen.ArrayIndexOutOfBoundExceptions
: Wird ausgelöst, wenn auf ein Array mit einem ungültigen Index zugegriffen wurde. Sicherheitsaußnahme
: Vom Sicherheitsmanager geworfen, um eine Sicherheitsverletzung anzuzeigen.NullPointerException
: Wird ausgelöst, wenn eine Methode oder Eigenschaft für ein Nullobjekt aufgerufen wird.Eine Methode, die möglicherweise eine ungeprüfte Ausnahme auslöst, enthält keine Informationen zu der Ausnahme, die in der Methodendeklaration ausgelöst wird.
public Integer divideByZero (Integer-Zähler, Integer-Nenner) Return-Zähler / Nenner; divideByZero (7, 0) // löst ArithmeticException aus
Diese Art von Ausnahmen kann durch Kodierungsrecht verhindert werden. Im obigen Code hätten wir vor dem Ausführen der Operation überprüfen müssen, ob der Nenner Null ist. Für diese Ausnahmen muss der Entwickler die Ausnahmebedingung nicht mithilfe von versuche es… fangen
Block. Mit anderen Worten, wir werden vom Compiler nicht gezwungen, den Code einzugeben, der die Ausnahme in einem auslösen könnte versuche es… fangen
Block. Stattdessen sollten wir nur sicherstellen, dass die Ausnahmen überhaupt nicht auftreten.
Denken Sie auch daran, dass Kotlin eine sichere Sprache ist. Mit anderen Worten, es kann uns helfen zu vermeiden NullPointerExceptions
in unserem Code. Sie können den Beitrag Nullability, Loops und Conditions lesen, um sich in Kotlin über die Sicherheit von Nullen zu informieren.
Eine Methode, die eine geprüfte Ausnahme auslösen kann, muss dies in ihrer Methodensignatur mit der wirft
Stichwort. Wenn Sie eine Methode aufrufen, die eine geprüfte Ausnahmebedingung auslöst, müssen Sie sie entweder erneut von Ihrer Funktion aus werfen oder sie abfangen und sie mit a behandeln versuche es… fangen
Block.
Geprüfte Ausnahmen sind Ausnahmen, die zur Kompilierzeit geprüft werden. Diese Ausnahmen erben von der Ausnahme
Klasse. Ein Beispiel für diese Art von Ausnahme ist IOException
. Dies kann auftreten, wenn Sie versuchen, auf eine Datei zuzugreifen, die nicht geöffnet werden kann, da sie nicht vorhanden ist. (FileNotFoundException
ist eine Unterklasse von IOException
.)
// führe in einem Hintergrund-Thread aus public void editFile (Datei, String-Text) try file.getParentFile (). mkdirs (); FileOutputStream fileOutputStream = neuer FileOutputStream (Datei); Writer writer = new BufferedWriter (neuer OutputStreamWriter (fileOutputStream)); try writer.write (text); writer.flush (); fileOutputStream.getFD (). sync (); Schließlich writer.close (); catch (IOException e) // Die Ausnahme protokollieren e.printStackTrace ();
Im vorhergehenden Code haben wir a verwendet versuche es… fangen
blockieren, um die IOException
in der Datei bearbeiten()
Methode. Wir können jetzt die anrufen Datei bearbeiten()
Methode als normal, und der Compiler beschwert sich nicht.
editFile (neue Datei (""), "mein Text");
Mit dem folgenden Code haben wir die Methode überarbeitet, stattdessen die wirft
Schlüsselwort in der Methodensignatur. Dies zeigt Anrufern an, dass sie die Ausnahme behandeln müssen IOException
das könnte beim Aufruf der Methode ausgelöst werden Datei bearbeiten()
.
// Dies sollte sich in einem Hintergrundthread befinden. public void editFile (Datei, String-Text) löst IOException file.getParentFile () aus. mkdirs (); FileOutputStream fileOutputStream = neuer FileOutputStream (Datei); Writer writer = new BufferedWriter (neuer OutputStreamWriter (fileOutputStream)); try writer.write (text); writer.flush (); fileOutputStream.getFD (). sync (); Schließlich writer.close ();
Um die Methode oben aufzurufen, müssen wir sie in ein umgeben versuche es… fangen
blockieren, um die Ausnahme zu behandeln.
try editFile (neue Datei (""), "mein Text"); catch (IOException e) e.printStackTrace ();
Dies ist ein kurzer Blick auf Ausnahmen in Java. Lassen Sie uns nun sehen, wie Kotlin Ausnahmen behandelt.
Der Hauptunterschied zwischen Kotlin- und Java-Ausnahmemechanismen besteht darin, dass alle Ausnahmen in Kotlin deaktiviert sind. Sie werden also nicht wie in Java in den Funktionssignaturen explizit deklariert.
fun editFile (Datei: Datei, Text: Zeichenfolge) file.parentFile.mkdirs () val fileOutputStream = FileOutputStream (Datei) val writer = BufferedWriter (OutputStreamWriter (fileOutputStream)) try writer.write (text) writer.flush () fileOutputStream .fd.sync () schließlich writer.close ()
Hier haben wir die konvertiert Datei bearbeiten()
Methode zu einer Kotlin-Funktion. Sie können sehen, dass die Funktion keine hat löst IOException aus
Anweisung in ihrer Funktionssignatur. wirft
ist nicht einmal ein Schlüsselwort in Kotlin.
Wir können diese Funktion auch aufrufen, ohne sie mit zu umgeben versuche es… fangen
Block-und der Compiler wird sich nicht beschweren. In Kotlin gibt es also keine geprüften Ausnahmen. Alle Ausnahmen sind nicht markiert. (Beachten Sie, dass die Programmausführung normal ist, wenn eine Ausnahme ausgelöst wird.)
Wenn wir der Meinung sind, dass diese Ausnahme auftreten könnte, sollten wir sie trotzdem behandeln, indem Sie die Methode mit a umgeben versuche es… fangen
block - dies wird jedoch vom Kotlin-Compiler nicht erzwungen.
try editFile (Datei (""), "Text 123") catch (e: IOException) e.printStackTrace ()
Wenn die Ausnahme in die geworfen wird Datei bearbeiten()
Funktion ist eine Instanz von IOException
Klasse, unsere Fang
Block wird ausgeführt, und wir drucken die Stapelablaufverfolgung einfach zu Debugging-Zwecken.
versuche es… fangen
BlockDas Versuchen
konstruiere mit Fang
und endlich
Klauseln in Kotlin ähneln denen von Java.
fun foo () try throw Ausnahme ("Exception message") catch (e: Exception) println ("Ausnahmebehandlung") finally println ("inside finally block")
Hier werfen wir ein Ausnahme
Objekt in der Versuchen
Block. Beachten Sie, dass wir das nicht aufgenommen haben Neu
Schlüsselwort wie in Java, um eine neue Instanz zu erstellen. Beachten Sie auch, dass wir nicht die Ausnahme angegeben haben, die in der Funktionssignatur ausgegeben wird, wie dies bei Java der Fall wäre.
Wir behandeln alle Unterklassen und Klassen des Typs Ausnahme
im Fangblock. Die Wahl endlich
Block wird immer ausgeführt. In diesem Fall werden normalerweise zuvor geöffnete Ressourcen oder Verbindungen geschlossen, um Ressourcenlecks zu vermeiden. Zum Beispiel, wenn Sie eine Datei öffnen oder eine Datenbank- oder Netzwerkverbindung in einem erstellen Versuchen
blockieren, sollten Sie es in einem schließen oder freigeben endlich
Block.
Beachten Sie, dass in Kotlin die werfen
Konstrukt ist ein Ausdruck und kann mit anderen Ausdrücken kombiniert werden.
val letter = 'c' val result = if (Buchstabe in 'a' ... 'z') Brief, ansonsten IllegalArgumentException ("Ein Buchstabe muss zwischen a bis z sein")
Auch die Versuchen
Konstrukt kann als Ausdruck verwendet werden.
fun foo (number: Int) val result = try if (number! = 1) throw IllegalArgumentException () true catch (e: IllegalArgumentException) false println (Ergebnis) foo (2) // false
Hier haben wir den aus der zurückgegebenen Wert zugewiesen versuche es… fangen
Block zum Ergebnis
Variable. Wenn die Nummer nicht ist 1
, es wirft ein IllegalArgumentException
und das Fang
Block wird ausgeführt. Das falsch
Ausdruck in der Fang
Blockwert wird dem zugewiesen Ergebnis
Variable. Wenn die Nummer ist 1
stattdessen dann die wahr
Der Ausdruckswert wird dem zugewiesen Ergebnis
Variable.
Ausnahmen in Kotlin verhalten sich in Java normal, aber ich möchte Sie auf eine nützliche Annotation aufmerksam machen @Throws
in Kotlin könnte das nützlich sein. Da alle Ausnahmen in Kotlin nicht aktiviert sind, wissen Entwickler, die Ihren Kotlin-Code von Java verwenden, möglicherweise nicht, dass Ihre Funktionen Ausnahmen auslösen. Sie können jedoch weiterhin die möglichen Ausnahmen hinzufügen, die möglicherweise mit der Methodensignatur ausgelöst werden @Werfen
Anmerkung. Dadurch werden Java-Aufrufer darauf hingewiesen, dass sie die Ausnahme behandeln müssen.
Sehen wir uns ein praktisches Beispiel für diese Annotation an.
/ * Functions.kt-Datei * / fun addNumberToTwo (a: Any): Int if (a! Is Int) throw IllegalArgumentException ("Nummer muss eine Ganzzahl sein") return 2 + a
Hier haben wir eine Kotlin-Funktion definiert, die eine Ausnahme auslösen kann IllegalArgumentException
nur wenn der an die Funktion übergebene Typ nicht vom Typ ist Int
.
Wir nennen diese Funktion der obersten Ebene addNumberToTwo ()
direkt aus Java auf folgende Weise:
public void myJavaMethod () Integer-Ergebnis = FunctionsKt.addNumberToTwo (5); System.out.println (Ergebnis); // 7
Das funktioniert gut; Der Compiler beschwert sich nicht. Wenn wir jedoch mit Java-Aufrufern kommunizieren möchten, können die addNumberToTwo ()
Bei der Top-Level-Funktion wird eine Ausnahme ausgelöst @Throws
Anmerkung zur Funktionssignatur.
@Throws (IllegalArgumentException :: class) fun addNumberToTwo (a: Any): Int if (a! Is Int) IllegalArgumentException werfen ("Zahl muss eine ganze Zahl sein") return 2 + a
Diese @Throws
Annotation kann eine durch Kommas getrennte Liste von Argumenten von Ausnahmeklassen akzeptieren. Im obigen Code haben wir nur eine Ausnahmeklasse eingefügt-IllegalArgumentException
.
Jetzt müssen wir unseren Java-Code aktualisieren, um die Ausnahme zu behandeln.
public void myJavaMethod () wirft IllegalArgumentException Integer-Ergebnis = FunctionsKt.addNumberToTwo (5); System.out.println (Ergebnis);
Wenn wir den Kotlin dekompilieren addNumberToTwo ()
Funktion mit der Kotlin-Bytecode anzeigen Funktion (wenn Sie sich in IntelliJ IDEA oder Android Studio befinden, verwenden Sie Werkzeuge > Kotlin > Kotlin-Bytecode anzeigen), wird folgender Java-Code angezeigt:
//… public static final int addNumberToTwo (@NotNull-Objekt a) wirft IllegalArgumentException Intrinsics.checkParameterIsNotNull (a, "a"); if (! (eine Instanz von Integer)) throw (Throwable) (neue IllegalArgumentException ("Number muss eine Ganzzahl sein")); else return 2 + ((Number) a) .intValue (); //…
Im generierten Java-Code oben (einige Elemente des generierten Codes wurden der Kürze halber entfernt), können Sie sehen, dass der Compiler die wirft
Schlüsselwort zur Methode Signatur, weil wir die @Throws
Anmerkung.
In diesem Tutorial haben Sie mehr über das Programmieren in Kotlin erfahren, indem Sie sich mit Ausnahmen beschäftigen. Wir haben gesehen, dass Kotlin keine Ausnahmen geprüft hat, stattdessen sind alle Ausnahmen deaktiviert. Wir haben uns auch mit dem Umgang mit Ausnahmen beschäftigt versuche es… fangen
Block und sah die Nützlichkeit der @Throws
Annotation in Kotlin für Java-Aufrufer.
Um mehr über die Kotlin-Sprache zu lernen, empfehle ich die Kotlin-Dokumentation. Auf Envato Tuts finden Sie auch einige unserer anderen Android-Apps zur Entwicklung von Apps!