Javaと違いKotlinはObjectをNullであることを禁止しています。
Javaでは、以下のようなコードを書くことができました。
1 2 |
// ok String str = null; |
しかしKotlinで同じコードを書くとコンパイルエラーになります。
1 2 3 4 |
fun main(args: Array<String>) { // コンパイルエラー var str : String = null } |
Error:(3, 24) Kotlin: Null can not be a value of a non-null type String
上記のようなエラーメッセージが吐かれました。
Javaのようにnullを代入したい場合は、?キーワードを以下のように使用します。
1 2 3 4 5 |
fun main(args: Array<String>) { var str : String? = null // null println(str) } |
型の後に?をつけることでnullを代入してもコンパイルエラーが起きなくなりました。
また、中身を出力するとnullと表示されます。
また、nullに代入したオブジェクトに文字列操作などnullでは動作しえない関数を呼び出すと、
ここでもコンパイルエラーになり、実行自体ができないようになっています。
1 2 3 4 5 |
fun main(args: Array<String>) { var str : String? = null // Error:(4, 16) Kotlin: Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String? println(str.toUpperCase()) } |
Stringオブジェクトの関数toUpperCase()を呼び出すところで、コンパイルエラーになります。
以上のようにKotlinでは、npeを出させないような工夫がされています。