(android.view.View$OnClickListener)' 在空对象引用 Kotlin 上

(android.view.View$OnClickListener)' on a null object reference Kotlin

提问人:S K 提问时间:7/19/2019 最后编辑:S K 更新时间:7/20/2019 访问量:3215

问:

我知道以前有很多类似的问题被问过,但通常,它们是用 Java 编写的。我遵循了多个教程,但每次都出现相同的错误。我遵循了本教程,它适用于其他脚本。

尝试了这个答案,但效果不佳。

这个问题是独一无二的,因为其他问题都是用 java 编写的,这对我来说并不容易。

这是我的:MainActivity

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        NumberVerButton()
    }

    private fun NumberVerButton() {
        next1.setOnClickListener {
            startActivity(Intent(this, NumberVer::class.java))
        }
    }
}

错误如下。

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.wyspiansky, PID: 20258
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.wyspiansky/com.example.wyspiansky.NumberVer}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference

我只想通过单击按钮移动到另一个活动。

android android-activity kotlin nullpointerexception

评论

2赞 Tamir Abutbul 7/19/2019
什么是 NullPointerException 的可能重复项,以及如何修复它?
0赞 Tamir Abutbul 7/19/2019
你的 US null,你需要在调用之前初始化它next1NumberVerButton()

答:

2赞 Reaz Murshed 7/19/2019 #1

您的变量永远不会被声明或初始化。我希望这是在某个地方声明的,否则,代码应该有编译错误。next1

因此,我的观察是变量未初始化。您需要将 声明为按钮,然后使用方法初始化变量,以使用布局中的特定视图引用 ID 标记此按钮。next1next1next1findViewById

class MainActivity : AppCompatActivity() {

    var next1: Button? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        next1 = findViewById(R.id.button) as Button
        NumberVerButton()
    }

    private fun NumberVerButton() {
        next1?.setOnClickListener {
            startActivity(Intent(this, MainActivity::class.java))
        }
    }
}

希望能有所帮助。

评论

0赞 S K 7/19/2019
非常感谢您的帮助。但是,现在我有 2 个语法错误。首先:next1 = findViewById(R.id.Button) as Button(R.id.Button 中的 Button 为红色)和 2.next1.setOnClickListener { (点之间是红色的,它告诉我我可以用 ?. 或 !!
0赞 Reaz Murshed 7/19/2019
我实际上想写一个示例代码。这可能有一些语法错误,我认为可以自己处理。
0赞 Reaz Murshed 7/19/2019
我试图删除语法错误,请立即检查更新的代码。谢谢。
-1赞 toddsalpen 7/19/2019 #2

首先,你需要一个对象来引用,看看你的源代码,你正在使用next1对象,该对象在源代码中没有任何位置声明。还有谁知道通常是什么类型的物体

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView

class MainActivity : AppCompatActivity() {

    //First you prepare your objects to use them
    private var text1: TextView? = null
    private var next1: Button? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //here you assign your references
        //between the Layout xml file and your objects
        text1 = findViewById(R.id.textView1)
        next1 = findViewById(R.id.button1)

        //here you set the click listener to your object
        // remember, it need to be a View object, in this case
        // is a Button which button heirs all from the parent class View
        next1!!.setOnClickListener{

            text1!!.text = "Hello S K, your click listener Works"

        }
    }
}

此外,您需要在每个对象的 android:id xml 属性中具有相同 id 名称的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"/>

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>

好吧,基本上你需要将任何你的 UI 布局对象附加到你的源代码中才能控制它们,如果你没有正确实例化你的对象,你将有 NullPointer 异常,因为你的源代码将尝试引用你的 next1 对象,但它从未被声明,也没有被实例化。

评论:老实说,如果你想要好的实践,你应该考虑用 Java 进行开发并继续使用 Kotlin,直到你真正掌握它。在某种程度上,所有像我这样的老开发人员都需要将 Witch 迁移到 Kotlin,但至少现在我不知道有人可以毫无问题地将所有旧源代码复制到 Kotlin。

评论

0赞 S K 7/20/2019
谢谢你,它帮了大忙!