Исключение NullPointerException иногда генерируется в ненулевых элементах списка в Kotlin - PullRequest
0 голосов
/ 05 апреля 2019

В настоящее время я разрабатываю приложение списка покупок для 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 в необнуляемом типе?Что я могу сделать, чтобы это исправить?Я даже не могу воспроизвести эту ошибку по требованию, потому что она кажется случайной и очень редко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...