Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么在通过自定义编辑文本从onSelectionChanged引用时变量没有实例化?_Android_Kotlin - Fatal编程技术网

Android 为什么在通过自定义编辑文本从onSelectionChanged引用时变量没有实例化?

Android 为什么在通过自定义编辑文本从onSelectionChanged引用时变量没有实例化?,android,kotlin,Android,Kotlin,根据调试器,onSelectionChanged中引用的任何变量均为null,如果我在运行示例应用时将以下内容添加到简单布局中,我的应用程序将以null指针崩溃 <com.dummy.DummyEditText android:layout_width="wrap_content" android:layout_height="wrap_content"/> 用stacktra

根据调试器,
onSelectionChanged
中引用的任何变量均为null,如果我在运行示例应用时将以下内容添加到简单布局中,我的应用程序将以null指针崩溃

 <com.dummy.DummyEditText
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
用stacktrace

     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.toString()' on a null object reference
        at com.dummy.DummyEditText.onSelectionChanged(DummyEditText.kt:15)
2020-10-05 12:14:25.794 22859-22859/com.dummy E/AndroidRuntime:     at android.widget.TextView.spanChange(TextView.java:10744)
        at android.widget.TextView$ChangeWatcher.onSpanAdded(TextView.java:13600)
        at android.text.SpannableStringBuilder.sendSpanAdded(SpannableStringBuilder.java:1287)
        at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:777)
        at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:676)
        at android.text.Selection.setSelection(Selection.java:96)
        at android.text.Selection.setSelection(Selection.java:78)
        at android.text.Selection.setSelection(Selection.java:153)
        at android.text.method.ArrowKeyMovementMethod.initialize(ArrowKeyMovementMethod.java:312)
        at android.widget.TextView.setText(TextView.java:6299)
        at android.widget.TextView.setText(TextView.java:6139)
        at android.widget.EditText.setText(EditText.java:121)
        at android.widget.TextView.<init>(TextView.java:1642)
        at android.widget.EditText.<init>(EditText.java:87)
        at android.widget.EditText.<init>(EditText.java:83)
        at androidx.appcompat.widget.AppCompatEditText.<init>(AppCompatEditText.java:74)
        at androidx.appcompat.widget.AppCompatEditText.<init>(AppCompatEditText.java:69)
        at com.dummy.DummyEditText.<init>(DummyEditText.kt:10)
原因:java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“java.lang.String java.lang.String.toString()”
在com.dummy.dummeyedittext.onSelectionChanged上(dummeyedittext.kt:15)
2020-10-05 12:14:25.794 22859-22859/com.dummy E/AndroidRuntime:at-android.widget.TextView.spanChange(TextView.java:10744)
在android.widget.TextView$ChangeWatcher.onSpanAdded(TextView.java:13600)
在android.text.SpannableStringBuilder.sendSpanAdded处(SpannableStringBuilder.java:1287)
位于android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:777)
位于android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:676)
在android.text.Selection.setSelection(Selection.java:96)中
位于android.text.Selection.setSelection(Selection.java:78)
位于android.text.Selection.setSelection(Selection.java:153)
在android.text.method.ArrowKeyMovementMethod.initialize(ArrowKeyMovementMethod.java:312)中
位于android.widget.TextView.setText(TextView.java:6299)
位于android.widget.TextView.setText(TextView.java:6139)
位于android.widget.EditText.setText(EditText.java:121)
位于android.widget.TextView。(TextView.java:1642)
在android.widget.EditText.(EditText.java:87)
在android.widget.EditText.(EditText.java:83)
在androidx.appcompat.widget.AppCompatEditText.(AppCompatEditText.java:74)
在androidx.appcompat.widget.AppCompatEditText.(AppCompatEditText.java:69)
在com.dummy.dummeyedittext.(dummeyedittext.kt:10)
所以问题是为什么变量
a
null?无论如何实例化
dummeyedittext
,当它第一次在
onSelectionChanged
中被引用时,它都应该被实例化。我错过了什么


任何关于正在发生的事情的指点都将不胜感激

在调试时,我发现在运行
init
块之前调用了
onSelectionChanged

如中所述:

在实例初始化期间,初始值设定项块的执行顺序与它们在类主体中出现的顺序相同,并与属性初始值设定项交错

调用
OnSelectionChanged
时,属性尚未初始化

因此,我相信,在其中一个超类中,构造函数中的某些代码必须导致调用
onSelectionChanged
。因此,在初始化任何属性之前,将调用
onSelectionChanged
,因此您的字段为空

下面是一个复制该场景的示例:

开放类父类{
初始化{
演示()
}    
开放式趣味演示(){
打印(“调用基类函数”)
}
}
类子对象():父对象(){
val demoext=“12345”
覆盖有趣的演示(){
super.demo()
println(demoext.toString())//由于demoext尚未实例化,此行将抛出一个NPE
}
}

我只能部分复制您的问题-在我得到NPE之前,我得到了“错误膨胀类com.x.y.dummeyedittext”,您也是这样吗?我需要添加
super.onSelectionChanged(selStart,selEnd)
,以便代码能够编译。是的,我也是这样认为的,顶部的错误是通货膨胀描述,但当你往下看时,你会发现它是由NPE引起的。奇怪的是,没有超级调用就无法编译它。我没有这个问题。啊,是的,这很有道理。这也是一个容易产生错误的来源,因为操作系统的实现细节可能会影响应用程序的稳定性。尤其是随着不同版本的Android和设备的实现发生变化。感谢您花时间回答这个问题,并演示了一个非常有用的问题。
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.toString()' on a null object reference
        at com.dummy.DummyEditText.onSelectionChanged(DummyEditText.kt:15)
2020-10-05 12:14:25.794 22859-22859/com.dummy E/AndroidRuntime:     at android.widget.TextView.spanChange(TextView.java:10744)
        at android.widget.TextView$ChangeWatcher.onSpanAdded(TextView.java:13600)
        at android.text.SpannableStringBuilder.sendSpanAdded(SpannableStringBuilder.java:1287)
        at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:777)
        at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:676)
        at android.text.Selection.setSelection(Selection.java:96)
        at android.text.Selection.setSelection(Selection.java:78)
        at android.text.Selection.setSelection(Selection.java:153)
        at android.text.method.ArrowKeyMovementMethod.initialize(ArrowKeyMovementMethod.java:312)
        at android.widget.TextView.setText(TextView.java:6299)
        at android.widget.TextView.setText(TextView.java:6139)
        at android.widget.EditText.setText(EditText.java:121)
        at android.widget.TextView.<init>(TextView.java:1642)
        at android.widget.EditText.<init>(EditText.java:87)
        at android.widget.EditText.<init>(EditText.java:83)
        at androidx.appcompat.widget.AppCompatEditText.<init>(AppCompatEditText.java:74)
        at androidx.appcompat.widget.AppCompatEditText.<init>(AppCompatEditText.java:69)
        at com.dummy.DummyEditText.<init>(DummyEditText.kt:10)