web-dev-qa-db-ja.com

安全またはnull以外のアサートされた呼び出しのみが、null許容のレシーバータイプのarraylistで許可されます

Android development.My arraylistはこのように宣言されています-

var day1: ArrayList<DietPlanDetailModel>? = null

今、私はその位置によって要素にアクセスしようとしています

    val dietPlan= day1[position]

しかし、コンパイル時エラーを下回っています-

安全またはnull以外のアサートされた呼び出しのみが、null許容のレシーバータイプのarraylistで許可されます

このエラーが発生するのはなぜですか?どうすれば解決できますか?

7

問題は、ArrayListnullableとして定義したことです。ここには2つのオプションがあります。

1)変数nullableを定義しないでください(これはコードによって異なります):var day1: ArrayList<DietPlanDetailModel> = ArrayList()

2)nullチェックを使用してデータ構造にアクセスします:val dietPlan= day1?.get(position)

19
guenhter

定義されているように、_day1_はnullにすることができますが、_[]_を実行して関数を呼び出しています。これは、基本的にday1.get(index)を呼び出すのと同じです。

これはNullpointerExceptionをスローする可能性があり、Kotlinコンパイラはこれを回避しようとします。したがって、次のような安全な呼び出しのみが許可されます:day1?.get()

6
s1m0nw1

変数をnullにすることができる(そしてそれにnullを割り当てる)ことをコンパイラに伝えました。

_day1[position]_は基本的にday1.get(position)であり、_day1_がnull-> null.get(position)の場合、NPEでクラッシュします

_day1_が初期化されることを保証できる場合は、lateinitをお勧めするか、そのまま、新しいArraylistに宣言を割り当てます。もちろん、単純なday1?.get(position)は問題なく動作します。

2
poss