【Kotlin練習問題】Nothing型

Kotlin

Nothing型とは

throwという式がKotlinにありますが、エルビス演算子(?:)を使った式の一部などで使われます。

val s = person.name ?: throw IllegalArgumentException("Name required")

throw式の型にはNothing型という特別な型が使われます。この型は特に値を持たず、コードが到達しえない場所を示すために使われます。また、Nothingを使うことで何も返さない関数をマークすることができます。

fun fail(message: String): Nothing {
    throw IllegalArgumentException(message)
}

この関数を呼び出す際、コンパイラーにこの関数の呼び出しより先は実行しないということを知らせることができます。

val s = person.name ?: fail("Name required")
println(s)     // person.nameがnullだった場合、failが呼び出され、sは出力されない。

また、型推論がされるときにもこの型が見られます。

この型のnull許容型はNothing?ですが、nullしか代入されることはありません。もし型推論の値を初期化するのにnullを使い、他に特定の型を決めるのに使われ得る情報がない場合、コンパイラーはNothing?型であると推測します。

val x = null           // xはnothing?型です
val l = listOf(null)   // lはList<Nothing?>型です

問題

failWithWrongAge関数の戻り値にNothing型を指定してください。

import java.lang.IllegalArgumentException

fun failWithWrongAge(age: Int?)    {
    throw IllegalArgumentException("Wrong age: $age")
}

fun checkAge(age: Int?) {
    if (age == null || age !in 0..150) failWithWrongAge(age)
    println("Congrats! Next year you'll be ${age + 1}.")
}

fun main() {
    checkAge(10)
}

Kotlin Playgroundでコードの編集・動作確認ができます。

答え

import java.lang.IllegalArgumentException

fun failWithWrongAge(age: Int?): Nothing {
    throw IllegalArgumentException("Wrong age: $age")
}

fun checkAge(age: Int?) {
    if (age == null || age !in 0..150) failWithWrongAge(age)
    println("Congrats! Next year you'll be ${age + 1}.")
}

fun main() {
    checkAge(10)
}
[解説]

fun failWithWrongAge(age: Int?): Nothingとすることで戻り値をNothing型に指定しています。

Nothing型がないとcheckAge関数がコンパイルされないということが重要です。コンパイラーはageがnullである場合を考えてしまうためです。

答え

その他の問題はこちらからどうぞ。

おすすめ書籍

Kotlinの文法をまず学びたい!という方には以下の書籍がおすすめです。Kotlinは日本語書籍がまだ豊富とは言えない状況ですが、細かく解説されており、Kotlin入門者のかたでもつまずくことなく学習できると思います。

実際にアプリを作りながら覚えていきたい!という方には以下もお勧めです。はじめに上の書籍で文法をさらっと学んでから取り組むのがお勧めです。

プロフィール

プロフィール
コードラボJP

大学卒業後SEに就職、現在は退職しフリーランスとして活動中。
『初心者でも挫折せずに一人でプログラミングを学べる』をモットーに、コードラボJPを開設
お問い合わせ等はcodelabsjp@gmail.comまで

コードラボJPをフォローする
タイトルとURLをコピーしました