Parameter specified as non-null is null一个?引发的惨案

本文介绍了在Android开发中,由于在实现SeekBar的OnSeekBarChangeListener时,忽视了非空参数可能导致的应用无限重启的错误。通过在BindingAdapter中适配器方法内忘记添加非空关键字引发的问题进行分析,并提供了修复方案,即在方法参数中添加非空问号。修复后,应用运行恢复正常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

漏写一个?导致app无限重启

有需求需要用到seekbar,因此自然需要加入seekbar 的OnSeekBarChangeListener,因为之前的项目使用了databinding,自然而然的顺手就在viewmodel内加了个变量var seekBarChangeListener: SeekBar.OnSeekBarChangeListener?=null然后,同样的在viewdatabinding内自定义了一个添加listener的bindingadapter如下

@BindingAdapter("onSeekBarChanged")
fun setSeekBarChanged(seekBar: SeekBar, onSeekBarChangeListener: SeekBar.OnSeekBarChangeListener){
    seekBar.setOnSeekBarChangeListener(onSeekBarChangeListener)
}

非常自然的在mainactivity里实现listener

 mainViewModel.seekBarChangeListener=object:SeekBar.OnSeekBarChangeListener{
            override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
                mainViewModel.textContent.set(progress.toString())
            }

            override fun onStartTrackingTouch(seekBar: SeekBar?) {
            }

            override fun onStopTrackingTouch(seekBar: SeekBar?) {
            }

        }

写完一跑,就开始了无限重启的情况,打断点debug显示初始化是正常的,查看log提示非空参数设为空了,我就很纳闷,明明都加了问号都是可为空的怎么会说我参数非空,最后找到logcat提示问题可能在viewdatabinding中,但是没有具体位子,因为定位实在import部分内,幸好代码不多,看了下新建的bindingadapter,终于发现adapter方法内的listener没有加非空关键字,加上后就正常了

@BindingAdapter("onSeekBarChanged")
fun setSeekBarChanged(seekBar: SeekBar, onSeekBarChangeListener: SeekBar.OnSeekBarChangeListener?){
    seekBar.setOnSeekBarChangeListener(onSeekBarChangeListener)
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值