7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Kotlinでnull.toString()

Last updated at Posted at 2019-09-16

突然ですがクイズです!

quiz1.kt
fun main() {
    println(null?.toString())
}
quiz2.kt
fun main() {
    println(null!!.toString())
}
quiz3.kt
fun main() {
    println(null.toString())
}

それぞれ結果はどうなるでしょうか!

  1. コンパイルエラー
  2. NullPointerException
  3. null
  4. "null"
  5. いずれでもない

正解(結果)

quiz1.result
null

過去私「うん」

quiz2.result
Exception in thread "main" kotlin.KotlinNullPointerException
	at MainKt.main(Main.kt:2)
	at MainKt.main(Main.kt)

過去私「だよね」

quiz3.result
null

過去私「?????(コンパイルエラー、仮に通ってもぬるぽだと思っていた顔)」

まさかと思って以下を実行。

stringdesuka.kt
fun main() {
    println(null?.toString() is String)
    println(null.toString() is String)
}

null.toString()はコンパイルエラーでもNullPointerExceptionでもなくnullの文字列"null"になる。え、"null"なの...と知った時はびっくりしました(空文字""ならまだわかるけど)。

false
true

そしてこれに関して、公式ドキュメントのtoString()のページにちゃんと書いてありました。
ちゃんと公式ドキュメントは読みましょうね..:innocent:

Returns a string representation of the object. Can be called with a null receiver, in which case it returns the string "null".

nullableのオブジェクトに対してtoString()をするとnullの文字列が返るのは仕様!
なので?.をつけ忘れてもコンパイルエラーやIntelliJ上でエラーも出ない。うっかりつけ忘れるとすると意図せぬ結果に出くわすかも...??

incorrect.kt
val msg: MessageObject? = null

// msg対する何かしらの処理
// 結果としてmsgがnullのままだったとする

// 出力 -> "null"
println(msg.toString() ?: "default message")

?.をつけてtoString()すれば当然だけど期待する結果が得られる。

correct.kt
val msg: MessageObject? = null

// msg対する何かしらの処理
// 結果としてmsgがnullのままだったとする

// 出力 -> "default message"
println(msg?.toString() ?: "default message")
7
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?