kotlin - 改造 给 kotlin.KotlinNullPointerException
问题描述
从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) 它给出错误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
}
}
API接口.kt
interface APIInterface {
@GET("Login.php")
fun getLoginData(@Query("user") user : String,
@Query("pass") pass : String) : Observable<LoginList>
}
解决方案
最可能的原因NullPointerException
是。compositeDisposable
null
在该MyActivity
变量的开头初始化为null
然后它永远不会更改,因此当您使用!!
运算符时会引发异常。我认为您可以compositeDisposable
直接使用正确的值进行初始化,例如val compositeDisposable = CompositeDisposable()
.
此外,val
应该尽可能优先var
考虑——因为不变性更容易控制——并且userName
可能password
是局部变量或至少是private
推荐阅读
- javascript - Highcharts 动态更新 x 轴类别
- c# - 设置播放器 go.transform.position 不改变位置
- excel - 使用 Visual Basic 将 PDF 插入 Excel
- javascript - 我可以覆盖导入到父级的祖父级方法吗?
- java - 如何使用 KafkaConsumer java SDK 使用来自 AWS MSK 集群的事件表单?
- django - 在 Django 模板中应用本地时区
- vue.js - 无法使用 'sudo npm uninstall @vue/cli -g' 来解除 vue.js
- azure-devops - Azure DevOps YAML 管道从传递的变量中删除引号和双反斜杠
- amazon-web-services - 如何通过 terraform 为 S3 存储桶添加公共权限
- r - 从 R 脚本渲染时如何将值传递给 Rmd 文件?