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)