不幸的是,该应用程序已停止Android工作室,并没有错误

时间:2017-07-23 19:18:34

标签: android kotlin kotlin-android-extensions

enter image description here

在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

    }


}

}

2 个答案:

答案 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编写的第三方库时可能就是这种情况。