首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kodein内部的NullPointerException

Kodein内部的NullPointerException
EN

Stack Overflow用户
提问于 2019-12-24 11:00:23
回答 1查看 163关注 0票数 0

我正在用Kodein尝试Kotlin,在我目前的项目中,我在Kodein得到了一个NPE,我不知道为什么。

我有一些数据类和匹配的存储库,它们提供了一个列表:

代码语言:javascript
复制
data class Cat(val name: String)

data class Dog(val name: String)

interface Repository<T> {
    val all: List<T>
}

interface CatRepository : Repository<Cat>

interface DogRepository : Repository<Dog>

这些存储库的实现目前由一个主类支持:

代码语言:javascript
复制
data class AnimalData(val cats: List<Cat>, val dogs: List<Dog>)

我为存储库创建了一个抽象基类:

代码语言:javascript
复制
abstract class AnimalDataRepository<T>(override val kodein: Kodein) : Repository<T>, KodeinAware {
    private val animalData: AnimalData by instance()
    abstract val property: (AnimalData) -> List<T>
    override val all: List<T> = animalData.let(property)
}

因此,存储库实现如下所示:

代码语言:javascript
复制
class CatRepositoryImpl(override val kodein: Kodein) : CatRepository, AnimalDataRepository<Cat>(kodein) {
    override val property = AnimalData::cats
}

将其设置并运行如下:

代码语言:javascript
复制
fun main() {
    val kodein = Kodein {
        bind<AnimalData>() with singleton { AnimalData(listOf(Cat("Tigger")), listOf(Dog("Rover"))) }
        bind<CatRepository>() with singleton { CatRepositoryImpl(kodein) }
    }

    val catRepository: CatRepository by kodein.instance()
    println(catRepository.all)
}

导致Kotlin内部的NPE:

代码语言:javascript
复制
Exception in thread "main" java.lang.NullPointerException
    at org.kodein.di.KodeinAwareKt$Instance$1.invoke(KodeinAware.kt:176)
    at org.kodein.di.KodeinAwareKt$Instance$1.invoke(KodeinAware.kt)
    at org.kodein.di.KodeinProperty$provideDelegate$1.invoke(properties.kt:42)
    at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
    at AnimalDataRepository.getAnimalData(KodeinExample.kt)
    at AnimalDataRepository.<init>(KodeinExample.kt:27)
    at CatRepositoryImpl.<init>(KodeinExample.kt:30)
    at KodeinExampleKt$main$kodein$1$2.invoke(KodeinExample.kt:40)
    at KodeinExampleKt$main$kodein$1$2.invoke(KodeinExample.kt)
    at org.kodein.di.bindings.Singleton$getFactory$1$1$1.invoke(standardBindings.kt:130)
    ...

我不知道为什么会这样。这与在AnimalDataRepository中使用"property“映射lamba有关,因为当我不使用时,它可以正常工作。

完整代码作为要点:https://gist.github.com/RoToRa/65d664d2d7497ddbf851a1be019f631d

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-27 14:40:20

这是因为在类AnimalDataRepository中定义了:

override val all: List<T> = animalData.let(property)

当Kodein懒散地工作时,因此以前定义了all,这就是为什么animalData是null的原因。但是,您可以通过执行以下操作来修复这个问题:

override val all: List<T> by lazy { animalData.let(property) }

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59467786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档