getter 方法抛出 StackOverflowError
getter method throwing StackOverflowError
我正在尝试在 Android 中使用数据绑定。但最终得到 Whosebug 错误。
loginViewModel.kt
class loginViewModel(): BaseObservable() {
@Bindable
var errorEmail:String?=null
get() {
if (userEmailAddress.isNullOrBlank())
return "Please Enter the Email Address"
else if (!isValidEmail(userEmailAddress))
return "Enter Valid Email Id."
else
return null
}
var userEmailAddress:String= String()
set(userEmailAddress){
field=userEmailAddress
notifyPropertyChanged(R.id.email_address)
/*to check Email for validation on every character inserted by user*/
notifyPropertyChanged(BR.errorEmail)
}
get() {
return userEmailAddress
}
}
错误日志:
07-04 13:54:15.435 6865-6865/com.example.itstym.reminder D/AndroidRuntime: Shutting down VM
07-04 13:54:15.513 6865-6865/com.example.itstym.reminder E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.itstym.reminder, PID: 6865
java.lang.WhosebugError: stack size 8MB
at com.example.itstym.reminder.loginViewModel.getUserEmailAddress(loginViewModel.kt:49)
at com.example.itstym.reminder.loginViewModel.getUserEmailAddress(loginViewModel.kt:49)
我知道当有任何递归调用时会发生 Whosebug 错误,但我不知道如何解决这个错误?
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data class="ActivityMainBinding">
<variable
name="login"
type="com.example.itstym.reminder.loginViewModel" />
</data>
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.itstym.reminder.MainActivity">
<EditText
app:error="@{login.errorEmail}"
android:text="@{login.userEmailAddress}"
android:hint="Email Address"
android:id="@+id/email_address"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:ems="10"
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="24dp"/>
</layout>
你也应该在你的 getter 中使用 field
,否则它会递归调用自己:
var userEmailAddress: String = String()
set(userEmailAddress){
field = userEmailAddress
...
}
get() {
return field // <-- here
}
您正在递归调用 getter。你应该写
get() = field
而不是
get() {
return userEmailAddress
}
field
标识符在 属性 的访问器中用于提供对 backing field 的访问,而引用 userEmailAddress
最终调用 getUserEmailAddress()
方法导致无限循环和 WhosebugError
.
我正在尝试在 Android 中使用数据绑定。但最终得到 Whosebug 错误。
loginViewModel.kt
class loginViewModel(): BaseObservable() {
@Bindable
var errorEmail:String?=null
get() {
if (userEmailAddress.isNullOrBlank())
return "Please Enter the Email Address"
else if (!isValidEmail(userEmailAddress))
return "Enter Valid Email Id."
else
return null
}
var userEmailAddress:String= String()
set(userEmailAddress){
field=userEmailAddress
notifyPropertyChanged(R.id.email_address)
/*to check Email for validation on every character inserted by user*/
notifyPropertyChanged(BR.errorEmail)
}
get() {
return userEmailAddress
}
}
错误日志:
07-04 13:54:15.435 6865-6865/com.example.itstym.reminder D/AndroidRuntime: Shutting down VM
07-04 13:54:15.513 6865-6865/com.example.itstym.reminder E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.itstym.reminder, PID: 6865
java.lang.WhosebugError: stack size 8MB
at com.example.itstym.reminder.loginViewModel.getUserEmailAddress(loginViewModel.kt:49)
at com.example.itstym.reminder.loginViewModel.getUserEmailAddress(loginViewModel.kt:49)
我知道当有任何递归调用时会发生 Whosebug 错误,但我不知道如何解决这个错误?
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data class="ActivityMainBinding">
<variable
name="login"
type="com.example.itstym.reminder.loginViewModel" />
</data>
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.itstym.reminder.MainActivity">
<EditText
app:error="@{login.errorEmail}"
android:text="@{login.userEmailAddress}"
android:hint="Email Address"
android:id="@+id/email_address"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:ems="10"
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="24dp"/>
</layout>
你也应该在你的 getter 中使用 field
,否则它会递归调用自己:
var userEmailAddress: String = String()
set(userEmailAddress){
field = userEmailAddress
...
}
get() {
return field // <-- here
}
您正在递归调用 getter。你应该写
get() = field
而不是
get() {
return userEmailAddress
}
field
标识符在 属性 的访问器中用于提供对 backing field 的访问,而引用 userEmailAddress
最终调用 getUserEmailAddress()
方法导致无限循环和 WhosebugError
.