リブログ記事【Kotlin】Lesson Vol.14 - Kotlinの文法:例外処理
はじめに前回は、はじめてのKotlinの文法:スマートキャストについて学習しました。今回はKotlinの文法:例外処理ついて説明していきます。以下は前回までの記事です。 第1章 はじめてのKotlinアプリケーション 1.1 開発環境の構築 1.2 Kotlinプロジェクトの作成 1.3 Kotlinプログラムの作成 第2章 Kotlinの文法 2.1 変数 2.2 関数 2.3データ型 2.4配列 2.5コレクション 2.6制御構文 2.7範囲 2.8Null安全 2.9等価性 2.10パッケージとインポート 2.11enum 2.12スマートキャスト 第2章:Kotlinの文法2.1 変数 2.1 変数を参照してください。2.2関数 2.2 関数を参照してください。<div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: 2.3データ型 2.3データ型を参照してください。<div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: 2.4配列 2.4配列を参照してください。<div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: 2.5コレクション 2.5コレクションを参照してください。<div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: 2.6制御構文 2.6制御構文を参照してください。<div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: 2.7範囲 2.7範囲を参照してください。<div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: 2.8Null安全 2.8Null安全を参照してください。<div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: 2.9等価性 2.9等価性を参照してください。<div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: 2.10パッケージとインポート 2.10パッケージとインポートを参照してください。<div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: 2.11enum 2.11enumを参照してください。<div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: 2.12スマートキャスト 2.12スマートキャストを参照してください。<div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: 2.13例外処理<div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: <div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: 今回はKotlinの例外処理について説明します。Kotlin の例外処理はJava の例外処理とよく似ています。■2.13.1 Kotlinにおける例外すべての例外はThrowableクラスから派生しています。 例外をスローするためにはthrowキーワードを使います。例えば、値が 0~100の範囲に収まっていない場合は、IllegalArgumentExceptionをスローする処理は以下のように記述できます。fun validation(percentage :Int) { if (percentage !in 0..100) { throw IllegalArgumentException("A percentage must be between 0 and 100 [parameter: $percentage]") }}上記の式を解くために、スマートキャスト(Smart cast)を使います。<div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: var message: String? = "Hello!" if(message != null) { // スマートキャスト print(message.length) // プロパティにアクセス可能 }}Javaと違って、例外のインスタンスを生成するのに new キーワードは不要です。Javaと違って、Kotlinでは throw構文は式となっているため、他の式の一部として利用する事ができます。以下は、if の条件に当てはまる場合はその値を返し、そうでなければ例外がスローされますfun validation(value :Int) = if (value in 0..100) { value } else { throw IllegalArgumentException("A percentage must be between 0 and 100 [parameter: $value]") }■2.13.2try-catch-finallyJavaと同じく、例外を処理するためにcatch節, finally節 を伴ったtry構文を使用します。fun readLineCount(reader: BufferedReader): Int { // この関数でスローされる可能性のある例外をここで明示する必要はない。 try { val str = reader.readLine() // IOException の可能性がある return str.toInt() } catch (e: NumberFormatException) { // 例ギアの方は右側に記載する return 0 } finally { reader.close() }}when文を使うことで、更にスマートキャストを活用できます。val list: List<Any> = listOf('a', 3, "abc", true)for (e in list) { val result: Any? = when(e) { is Int -> e + 3 is String -> e.toUpperCase() is Char -> e is Boolean -> e.not() else -> null } println(result)}Javaと違いKotlinではthrows節が存在しません。また、Javaでは、IOException は検査例外(checked exception)であるため、明示的な記述が必要ですが、Kotlin では検査例外と非検査例外を区別していません。ある関数からスローされる例外を指定する必要はなく、使用する側では、どの例外についても、処理してもいいし、しなくてもかまいません。■2.13.3式としてのtryKotlin のtryキーワードは、ifやwhenと同じように式として使用され、変数にその値を割り当てる事ができます。fun printReadLineCount(reader: BufferedReader) { val number = try { Integer.parseInt(reader.readLine()) } catch (e: NumberFormatException) { 0 } println("read value = $number")}この関数を以下のように呼び出すと、val reader = BufferedReader(StringReader("not a number")printReadLineCount(reader))結果は以下のようになります。read value = 0<div e1c88aa8c02b82358a9d="" https:="" items="" promari="" qiita.com="" style="border-left: おわりに如何でしょうか。Kotlinの例外処理において、tryキーワードは、ifやwhenと同じように式として使用され、変数にその値を割り当てる事ができるなどJavaと異なる部分があります。よりスマートに例外を書くことができるため、例外処理の冗長なコードを省くことができます。お知らせブログ情報プロマリのブログで昨日8月2日(金)の気になるNews記事をまとめてみました。皆様も面白いニュースがありましたら教えてくださいね。written by たみと@プロマリ