在Android监视器中,它会像图片中那样出现此错误,我无法理解为什么XML中存在错误? 代码没问题 可以添加它的图片会出现这个错误吗?
class MainActivity : AppCompatActivity() {
val ListOffood = ArrayList<Food>()
var adpter:foodAdapter=null!!
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
ListOffood.add(Food("sandwis","m3 t7eneh",R.drawable.ic_stat_name))
ListOffood.add(Food("sandwis","m3 t7eneh",R.drawable.ic_stat_name))
ListOffood.add(Food("sandwis","m3 t7eneh",R.drawable.ic_stat_name))
ListOffood.add(Food("sandwis","m3 t7eneh",R.drawable.ic_stat_name))
ListOffood.add(Food("sandwis","m3 t7eneh",R.drawable.ic_stat_name))
adpter=foodAdapter(this,ListOffood)
graidV.adapter=adpter
}
class foodAdapter: BaseAdapter {
var ListOffood=ArrayList<Food>()
var context: Context?=null
constructor(context: Context, ListOffood:ArrayList<Food>):super(){
this.context=context
this.ListOffood=ListOffood
}
override fun getView(p0: Int, p1: View?, p2: ViewGroup?): View? {
val food = ListOffood[p0]
var view = LayoutInflater.from(context).inflate(R.layout.foodlist,p2,false)
view.textV.text=food.name
view.imageV.setImageResource(food.image!!)
return view
}
override fun getItem(p0: Int): Any {
return ListOffood[p0]
}
override fun getItemId(p0: Int): Long {
return p0.toLong()
}
override fun getCount(): Int {
return ListOffood.size
}
}
}
答案 0 :(得分:1)
属性adapter
应该使用late-initialized属性或可空属性。否则,您将获得NPE-lovers运营商KotlinNullPointerException
的{{1}},例如:
!!
应该是late-initialized属性:
// v---cast `null` to any type will throws NullPointerException
var adpter:foodAdapter=null!!
OR 可以为空的属性:
lateinit var adpter:foodAdapter
答案 1 :(得分:0)
要扩展holi-java答案,Kotlin与Java不同,试图成为null safe language。
除非明确定义,否则Kotlin中的所有变量都不可为空。因此,如果您希望拥有一个可以保存null
值的变量,则需要在类型名称后添加?
以表明情况属实。
var canBeNull: String? = null
var canNotBeNull: String = null // Won't compile
var canNotBeNull2: String = null!! // Will crash and burn at runtime
在您的示例中,您强制编译器将null
值接受到导致运行时NPE的adapter
变量中。
只有当您确定值不会为!!
但编译器无法进行区分时,才应使用null
语法。使用用Java编写的第三方库时可能就是这种情况。