初心者用kotlin

kotlinのメモです。

1377 views

mutableのNULL

クラスTest1がクラスTestのメンバ変数で宣言されている(8行目)。
そして、Test1クラスのinitメソッドでインスタンスが生成される(11行目)。
そのあと、test1Funcメソッドで呼び出される(15行目)。
しかし、以下のコードはコンパイルエラーになる。

class Test {
    fun myFunc() {
        println("test")
    }
}

class Test1 {
    var test:Test?=null

    fun init() {
        test = Test()
    }
    fun test1Func() {
        if(test != null) {
            test.myFunc()
        }

    }
}
fun main(args:Array<String>){
    var test1 = Test1()
    test1.init()
    test1.test1Func()
}

コンパイルエラーになる箇所は15行目。test1でnull判定を行っているが、null判定の方法が誤っているとしてエラーになる。
コンパイラのエラーメッセージは以下のとおり。
「Smart cast to 'Test' is impossible, becaue 'test' is a mutable property that could have been changed by this time」
日本語に直すと
「'Test'へのスマートキャストは不可能です。'test'(メンバ変数)はこの時点で変更可能なプロパティであるためです。」
14行目でnull判定しているにも関わらず、15行目でnullに変更されているかもしれないからダメだ、そういう解釈でよいのか?
14行目を抜けた後、15行目を実行する前に別スレッドでnullに戻されている可能性を示唆している。
よって、8行目を?で呼び出すのが正しい。

class Test1 {
    var test:Test?=null

    fun init() {
        test = Test()
    }
    fun test1Func() {
        test?.myFunc()
    }
}

上8行目を?にしてinit関数を呼び出したらどうなるか実験してみた。
myFuncは呼び出されず、そのまま正常終了する。

fun main(args:Array<String>){
    var test1 = Test1()
    //test1.init()
    test1.test1Func()
}

ちなみに、「うるせー!!!!!!!!!!!!!!!!!nullでも呼び出せ!!!!!!!!!!!!」と、プログラムは気合で動くと思っている方のために、
ドラゴンボール記法が用意されている。testの後ろに!!をつければよい。

class Test1 {
    var test:Test?=null

    fun init() {
        test = Test()
    }
    fun test1Func() {
        test!!.myFunc()
    }
}

当然、test1.init()を呼び出さずに実行したら以下のとおりである。

Exception in thread "main" kotlin.KotlinNullPointerException
    at Test1.test1Func(nulltest.kt:14)
    at NulltestKt.main(nulltest.kt:20)

気合では動かない。暫定処置などで使うくらいかなぁ。

Page 7 of 36.

前のページ 次のページ



[添付ファイル]


お問い合わせ

プロフィール

マッスル

自己紹介

本サイトの作成者。
趣味:プログラム/水耕栽培/仮想通貨/激辛好き
プログラムは趣味と勉強を兼ねて、のんびり本サイトを作っています。
フレームワークはdjango。
仮想通貨はNEMが好き。
水耕栽培は激辛好きが高じて、キャロライナ・リーパーの栽培にチャレンジ中。

サイト/ブログ

https://www.osumoi-stdio.com/pyarticle/

ツイッター

@darkimpact0626