Kotlin Android TextView KotlinNullPointerException

时间:2018-07-21 12:24:22

标签: android nullpointerexception kotlin

我决定用Kotlin编写小程序。现在我有一个无法解决的问题。这是由于NullPointerException。而且Logcat总是在我编写此textView_msg!!.text = "${currencyList[p2]}"的行中向我显示错误。请帮我。

这是我的代码

open class CurrencyActivity : AppCompatActivity() {

        open var textView_msg: TextView? = null
        open var textView: TextView? = null
        open val currencyList = arrayOf("AUD","CAD","CHF","EUR","GBP","JPY","NZD","KHR","USD","CNY","THB","INR")

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.currency_activty)
            setUpSpinnerData()
        }

        //This method will be invoked to setup data of the spinner views
        //to show lists of currency types for selection
        fun setUpSpinnerData() {
            textView_msg = findViewById(R.id.setCurrencyFrom) as TextView
            textView = findViewById(R.id.setCurrencyTo) as TextView

            val spFrom: Spinner = findViewById(R.id.fromCurrency)
            spFrom.onItemSelectedListener = ItemSelectedFrom()
            val afrom: ArrayAdapter<String> = ArrayAdapter(this, R.layout.support_simple_spinner_dropdown_item, currencyList)
            spFrom.adapter = afrom

            val spTo: Spinner = findViewById(R.id.toCurrency)
            spTo.onItemSelectedListener = ItemSelectedTo()
            val ato: ArrayAdapter<String> = ArrayAdapter(this, R.layout.support_simple_spinner_dropdown_item, currencyList)
            spTo.adapter = ato

        }

        class ItemSelectedFrom: CurrencyActivity(), AdapterView.OnItemSelectedListener {
            override fun onNothingSelected(p0: AdapterView<*>?) {}

            override fun onItemSelected(p0: AdapterView<*>?, p1: View?, p2: Int, p3: Long) {
                //textView_msg = findViewById(R.id.setCurrencyFrom) as TextView
                textView_msg!!.text = "${currencyList[p2]}"
            }
        }

        class ItemSelectedTo : CurrencyActivity(), AdapterView.OnItemSelectedListener {
            override fun onNothingSelected(p0: AdapterView<*>?) {}

            override fun onItemSelected(p0: AdapterView<*>?, p1: View?, p2: Int, p3: Long) {
                //textView = findViewById(R.id.setCurrencyTo) as TextView
                textView!!.text = "${currencyList[p2]}"
            }
        }
    }`

1 个答案:

答案 0 :(得分:2)

是的,我做到了。感谢所有试图帮助我的人。我只是稍微重写了一下(但是在注释中我有一个旧代码)。这是我的解决方法。

class CurrencyActivity : AppCompatActivity() {

        var textView_msg: TextView ?= null
        var textView: TextView ?= null

        var currencyList = arrayOf("AUD","CAD","CHF","EUR","GBP","JPY","NZD","KHR","USD","CNY","THB","INR")

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.currency_activty)
            setUpSpinnerData()
        }

        //This method will be invoked to setup data of the spinner views
        //to show lists of currency types for selection
        fun setUpSpinnerData() {

            val spFrom: Spinner = findViewById(R.id.fromCurrency)
            spFrom.onItemSelectedListener = onItemSelectedListener0
            val afrom: ArrayAdapter<String> = ArrayAdapter(this, R.layout.support_simple_spinner_dropdown_item, currencyList)
            spFrom.adapter = afrom

            val spTo: Spinner = findViewById(R.id.toCurrency)
            spTo.onItemSelectedListener = onItemSelectedListener1
            val ato: ArrayAdapter<String> = ArrayAdapter(this, R.layout.support_simple_spinner_dropdown_item, currencyList)
            spTo.adapter = ato

        }

        var onItemSelectedListener0: OnItemSelectedListener = object : OnItemSelectedListener {
            override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) {
                textView_msg = findViewById(R.id.LALALALA)
                Log.e("KUKU", currencyList[position])
                textView_msg?.text = "${currencyList[position]}"
            }

            override fun onNothingSelected(parent: AdapterView<*>) {}
        }

        var onItemSelectedListener1: OnItemSelectedListener = object : OnItemSelectedListener {

            override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) {
                textView = findViewById(R.id.NANANANA)
                textView?.text = "${currencyList[position]}"
            }

            override fun onNothingSelected(parent: AdapterView<*>) {}

        }

    //    class ItemSelectedFrom: CurrencyActivity(), AdapterView.OnItemSelectedListener {
    //        override fun onNothingSelected(p0: AdapterView<*>?) {}
    //
    //        override fun onItemSelected(p0: AdapterView<*>?, p1: View?, p2: Int, p3: Long) {
    //            textView_msg = findViewById(R.id.LALALALA)
    //            Log.e("KUKU", currencyList[position])
    //            textView_msg?.text = "${currencyList[position]}"
    //        }
    //    }
    //
    //    class ItemSelectedTo : CurrencyActivity(), AdapterView.OnItemSelectedListener {
    //        override fun onNothingSelected(p0: AdapterView<*>?) {}
    //
    //        override fun onItemSelected(p0: AdapterView<*>?, p1: View?, p2: Int, p3: Long) {
    //            textView = findViewById(R.id.NANANANA)
    //            textView?.text = "${currencyList[position]}"
    //        }
    //    }
    }

现在是什么问题。解释。

 var textView_msg: TextView ?= null
// Initialize it somewhere.

textView_msg?.text = "${currencyList[position]}" // Calls setText if textView_msg != null
textView_msg!!.text = "${currencyList[position]}" // Throws an exception if textView_msg == null