【问题标题】:retrofit Give kotlin.KotlinNullPointerException改造 给 kotlin.KotlinNullPointerException
【发布时间】:2019-04-18 09:32:47
【问题描述】:

从Sql server 获取数据,获取数据json。这个json数据解析retofit2。 创建了登录活动,但它给出了错误

MainActivity.kt

class MainActivity : AppCompatActivity() {


    internal lateinit var api : APIInterface

    private var compositeDisposable : CompositeDisposable? = null

    var userName : String? = null

    var password : String? = null

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

        btnLogin.setOnClickListener {

            userName = tvUsername.text.toString()
            password = tvPassword.text.toString()

            getUserName(userName!!,password!!)
        }
    }

    fun getUserName(user : String, pass : String){


        val retrofit = APIClient.apIClient
        if (retrofit != null) {
            api = retrofit.create(APIInterface::class.java)
        }
        compositeDisposable!!.add(api.getLoginData(user, pass)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe({
                    if (it.success.equals(1)){

                    val intent = Intent(this,Company::class.java)
                    startActivity(intent)

                    Toast.makeText(this,"Login Successfully!!!",Toast.LENGTH_LONG).show()
                }else{

                    Toast.makeText(this,"UserName or Password is Wrong!!!",Toast.LENGTH_LONG).show()
                }
                },{
                    Toast.makeText(this, it.message, Toast.LENGTH_LONG).show()
                })
        )
    }
}

当调试器到达compositeDisposable!!.add(api.getLoginData(user, pass) 时,它会给出Error kotlin.kotlinNullPointerException

RestApi 网址:

http://localhost/Account/Login.php?user=ABC&pass=1

APIClient.kt

object APIClient {
   val BASE_URL = "http://10.0.2.2/Account/"
    var retrofit:Retrofit? = null
    val apIClient:Retrofit?
        get() {
            if (retrofit == null)
            {
                retrofit =  Retrofit.Builder().
                        baseUrl(BASE_URL)
                        .addConverterFactory(GsonConverterFactory.create())
                        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                        .build()
            }
            return retrofit
        }


}

APIInterface.kt

interface APIInterface {
 @GET("Login.php")
    fun getLoginData(@Query("user") user : String,
                     @Query("pass") pass : String) : Observable<LoginList>
}

【问题讨论】:

  • 好吧,你从来没有初始化compositeDisposable然后强制解包它。

标签: kotlin retrofit2


【解决方案1】:

NullPointerException 最可能的原因是compositeDisposablenull

MyActivity 的开头,该变量被初始化为null,然后它就永远不会改变,所以当你使用!! 操作符时会抛出异常。 我认为您可以使用正确的值直接初始化compositeDisposable,例如val compositeDisposable = CompositeDisposable()

此外,val 应尽可能优先于 var - 因为不变性更容易控制 - 并且 userNamepassword 可能是局部变量或至少 private

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 2018-09-10
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    相关资源
    最近更新 更多