В настоящее время я разрабатываю приложение списка покупок для Android с использованием привязки данных и Kotlin, и я получаю NullPointerException
для объекта типа (Item
), который даже не может быть нулевым:
java.lang.NullPointerException: Attempt to invoke virtual method 'double com.example.shoppinglistapp.data.shoppinglists.models.Item.getItemPrice()' on a null object reference
at com.example.shoppinglistapp.data.shoppinglists.models.ShoppingList.getShoppingListPrice(ShoppingList.kt:90)
at com.example.shoppinglistapp.viewmodels.ShoppingListViewModel$onShoppingListPropertyChangedListener$1.onPropertyChanged(ShoppingListViewModel.kt:263)
at androidx.databinding.PropertyChangeRegistry$1.onNotifyCallback(PropertyChangeRegistry.java:30)
В модели ShoppingList
, которая наследуется от BaseObservable
, у меня есть список предметов:
@get:Bindable
val items = mutableListOf<Item>()
Каждый из этих предметов имеет тип Item
(который является классомэто также наследуется от BaseObservable
).
Поскольку некоторые свойства списка покупок зависят от его элементов, всякий раз, когда я добавляю новый экземпляр Item
в список, я подписываюсь на его изменения свойств.Таким образом, соответствующие свойства списка покупок будут обновлены при изменении элемента:
private val onItemPropertyChangedCallback = object: Observable.OnPropertyChangedCallback() {
override fun onPropertyChanged(sender: Observable?, propertyId: Int) {
when (propertyId) {
// If the price of an item changes, we notify that the property
// "shoppingListPrice" of the shopping list has been updated
BR.itemPrice -> { notifyPropertyChanged(BR.shoppingListPrice) }
}
}
}
...
// Thanks to the callback shown above, this property of the shopping list
// updates automatically in the view whenever an item changes its price
val shoppingListPrice
@Bindable(value = ["items"])
get() = items.sumByDouble { it.itemPrice }
...
fun addItem(item: Item) {
// We subscribe to the property changes of each new item that gets added
item.addOnPropertyChangedCallback(onItemPropertyChangedCallback)
items.add(item)
notifyPropertyChanged(BR.items)
notifyPropertyChanged(BR.shoppingListPrice)
}
Как можно получить NullPointerException
в необнуляемом типе?Что я могу сделать, чтобы это исправить?Я даже не могу воспроизвести эту ошибку по требованию, потому что она кажется случайной и очень редко.