kotlinのメモです。
1679 views
クラス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。
ChatGPTで自動プログラム作成に取り組み中。
https://www.osumoi-stdio.com/novel/