【问题标题】:kotlin.UninitializedPropertyAccessException: lateinit property salesGST has not been initializedkotlin.UninitializedPropertyAccessException:lateinit 属性 salesGST 尚未初始化
【发布时间】:2019-04-09 08:39:32
【问题描述】:

使用retrofit2和rxjava2在android中显示Json Server数据,当参数传递给接口时会报错。

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()


        }))



    }

Model Class 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>

【问题讨论】:

    标签: kotlin retrofit2


    【解决方案1】:

    只需从SalesGSTList 中的lateinit var salesGST : ArrayList&lt;SalesGST&gt; 行中删除lateinit

    class SalesGSTList {
    
        val success : String = ""
    
        var salesGST : ArrayList<SalesGST>? = null
        // you can also use
        // var salesGST : ArrayList<SalesGST>  = ArrayList()
    }
    

    更多信息请访问kotlin-when-to-use-lazy-or-lateinit

    【讨论】:

    • 因为如果值未分配给变量,salesGST 为 null。 FIRST Kotlin 让您能够安全 运行并避免 NullPointerException。 SECOND 您还可以将获得salesGST 的代码包装在if(salesGST !=null){} 等非空条件中。 第三你可以使用var salesGST : ArrayList&lt;SalesGST&gt; = ArrayList()而不是var salesGST : ArrayList&lt;SalesGST&gt;? = null
    • 但我创建了其他模型类声明 Arraylist:lateinit var year:ArrayList。成功获取数据。
    • 无论何时使用lateinit 属性,都必须为变量赋值,否则会抛出错误kotlin.UninitializedPropertyAccessException: lateinit property has not been initialized。所以更好的选择是使用var salesGST : ArrayList&lt;SalesGST&gt; = ArrayList() 它将返回空白数组列表并且永远不会抛出任何错误。
    • var salesGST : ArrayList = ArrayList() 它给出 null ArrayList
    猜你喜欢
    • 2021-06-21
    • 2020-04-18
    • 2021-04-02
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 2022-06-23
    • 1970-01-01
    • 2020-11-01
    相关资源
    最近更新 更多