Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin Kodein内部的NullPointerException_Kotlin_Nullpointerexception_Kodein - Fatal编程技术网

Kotlin Kodein内部的NullPointerException

Kotlin Kodein内部的NullPointerException,kotlin,nullpointerexception,kodein,Kotlin,Nullpointerexception,Kodein,我正在和Kodein一起试用Kotlin,在我目前的项目中,我在Kodein内部得到了一个NPE,我不知道为什么 我有一些数据类和匹配的存储库,它们提供了它们的列表: data class Cat(val name: String) data class Dog(val name: String) interface Repository<T> { val all: List<T> } interface CatRepository : Repository

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

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

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>
数据类Cat(val名称:字符串)
数据类狗(val名称:字符串)
接口存储库{
val all:列表
}
接口CatRepository:存储库
接口存储库:存储库
这些存储库的实现目前由一个主类支持:

data class AnimalData(val cats: List<Cat>, val dogs: List<Dog>)
数据类动物数据(瓦尔猫:列表,瓦尔狗:列表)
我为存储库创建了一个抽象基类:

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)
}
抽象类AnimalDataRepository(覆盖val-kodein:kodein):存储库,KodeinAware{
私有val animalData:animalData by instance()
抽象值属性:(AnimalData)->List
覆盖val all:List=animalData.let(属性)
}
因此,存储库实现如下所示:

class CatRepositoryImpl(override val kodein: Kodein) : CatRepository, AnimalDataRepository<Cat>(kodein) {
    override val property = AnimalData::cats
}
类CatRepositoryImpl(覆盖val-kodein:kodein):CatRepository,AnimalDataRepository(kodein){ 覆盖val属性=AnimalData::cats } 设置此选项并使用以下选项运行:

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)
}
fun main(){
val kodein=kodein{

bind

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

override val all:List=animalData.let(属性)

当Kodein在懒洋洋地工作时,因此之前定义了
all
,这就是
animalData
为空的原因。但是,您可以通过执行以下操作来解决此问题:

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

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)
    ...