blitz-time アプリ開発ブログ

Androidアプリ開発などのTips集

【Kotlin入門】Caused by: kotlin.TypeCastException: null cannot be cast to non-null type

「はじめてのAndroidプログラミング」でフラグメントの勉強中です。現在、第7章の「フラグメントで動物ずかんを作ろう」に取り組み中。

ActivityからFragmentから派生したTitleFragmentのインスタンスを取得して、メソッドを実行するのですが、実行時に「Caused by: kotlin.TypeCastException: null cannot be cast to non-null type ***.TitleFragment」という例外が発生します。

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val fragment = titleFragment as TitleFragment
        fragment.setTitle("フラグメントタイトル")
    }
}

nullはnon-nullであるTitleFragmentにはキャストできないという事です。

正解は、

        val fragment = titleFragment as? TitleFragment
        fragment?.setTitle("フラグメントタイトル")

でした。「as?(安全キャスト演算子)」です。「型が一致すればキャストを行い、一致しなければnullを返す。」というもので、もちろんnullが返ってくる場合がありますので、fragmentを利用する場合にも「fragment?」としなければなりません。
まだまだ修行が足りません。

で、実行すると、
f:id:mfblitz:20200621071247p:plain
あれ、変わっていない。
そもそも始めにに「nullはキャストできない」というエラーだったわけで、それは「titleFragment」が「null」、つまり存在しないという事ですね。

よく見ると、Fragmentのidが「fragment」になっていました。
f:id:mfblitz:20200621071514p:plain
これを「titleFragment」に修正したところ、タイトルが変更されました。
f:id:mfblitz:20200621071618p:plain

いけました!

次行ってみよう!!

appdev.blitz-time.com
appdev.blitz-time.com
appdev.blitz-time.com
appdev.blitz-time.com