Kotlin From Scratch Ausnahmebehandlung

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. 

1. Ausnahmebehandlung

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. 

Ungeprüfte 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. 

Geprüfte Ausnahmen in Java

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. 

2. Ausnahmen in Kotlin

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.

Das versuche es… fangen Block

Das 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.

Java-Interop

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. 

Fazit

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!