kotlin.UninitializedPropertyAccessException: lateinit свойство salesGST не было инициализировано

#kotlin #retrofit2

#kotlin #retrofit2

Вопрос:

Данные сервера Json отображаются в Android с использованием retrofit2 и rxjava2, когда параметр передается в inteface, а затем выдает ошибку.

 class Sales : AppCompatActivity() {

    internal lateinit var api : APIInterface

    private var compositeDisposable : CompositeDisposable? = null

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


        compositeDisposable = CompositeDisposable()

       fetchYearData()
    }

  private fun fetchYearData(){

        val retrofit = APIClient.apIClient
        if (retrofit != null) {
            api = retrofit.create(APIInterface::class.java)
        }


   compositeDisposable!!.add(api.getSalesGSTData(1,1,"04/01/2018","31/03/2019")
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe( { displaySalesGSTData(it.salesGST) },
                {

                    Toast.makeText(this,it.message,Toast.LENGTH_LONG).show()


        }))



    }
  

Класс модели SalesGSTList JSONObject после его успеха и после JSONArray и JSONObject .

SalesGSTList.kt

 class SalesGSTList {

    val success : String = ""

    lateinit var salesGST : ArrayList<SalesGST>
}
  

SalesGST.kt

 class SalesGST {

    var FYearID : Int = 0

    var Cmp_Name : String? = ""

    var GSTIN : String? = ""
}
  

Интерфейс

 @GET("SalesGST.php")
    fun getSalesGSTData(@Query("cid") cid : Int,@Query("fid") fid : Int,@Query("fd") fd : String,@Query("td") td : String) : Observable<SalesGSTList>
  

Ответ №1:

Просто удалите lateinit из строки lateinit var salesGST : ArrayList<SalesGST> SalesGSTList .

 class SalesGSTList {

    val success : String = ""

    var salesGST : ArrayList<SalesGST>? = null
    // you can also use
    // var salesGST : ArrayList<SalesGST>  = ArrayList()
}
  

для получения дополнительной информации посетите kotlin-when-to-use-lazy-или-lateinit

Комментарии:

1. потому salesGST что равно null, если переменной не присвоено значение. ВО- ПЕРВЫХ , Kotlin дает вам возможность работать безопасно и избегать исключения NullPointerException. ВО- вторых , вы также можете обернуть код, в котором вы попадаете salesGST в условие not null, например if(salesGST !=null){} . В- ТРЕТЬИХ , вы можете использовать var salesGST : ArrayList<SalesGST> = ArrayList() вместо var salesGST : ArrayList<SalesGST>? = null .

2. но я создал другой класс модели, объявив Arraylist : lateinit var year : ArrayList<Год> . его данные успешно получены.

3. всякий раз, когда вы используете lateinit свойство, вы должны присвоить значение переменной, иначе она выдаст ошибку kotlin.UninitializedPropertyAccessException: lateinit property has not been initialized . ПОЭТОМУ лучшим вариантом является использование var salesGST : ArrayList<SalesGST> = ArrayList() , которое возвращает пустой список массивов и никогда не выдает никаких ошибок.

4. var salesGST : ArrayList<SalesGST> = ArrayList() дает нулевой список массивов