首页 > 解决方案 > 我创建类的对象并得到一个错误“线程“主”java.lang.StackOverflowError中的异常”

问题描述

我创建类人。现在我尝试使用此类的对象创建列表。当我创建它时,我收到此错误:“BodyKt$main$Person.(body.kt:9) 处的线程“main”java.lang.StackOverflowError 异常”。我做错了什么?

fun main() {
    // copy object in object
    class Person (var name: String = "Orig", var type: String = "piece",
                       var age: Int = 18, var high: Double = 25.7, var code: Int = 1522)
    {
        var info: String = "0"
            get() = "Name: $name Age: $age Type: $type High: $high Code: $code"
        var somebody : List<Person> = listOf(
            Person("Copy", "some", 15, 11.1, 1870))
    }
    var default: Person = Person()
    val ann: Person = Person("Ann", "man", 10, 0.5, 1408) // 1st object with some properties
    var bob: Person = Person("Bob", "girl", 20, 15.0, 1239) // 2nd object without prop
    println("Properties of Ann: ${ann.info}") // props 1st object
    println("Properties of Bob: ${bob.info}") // props 2nd object
    println("Default: ${default.info}") // props default
    bob = ann.deepCopy() // copy 1st in 2nd
    println("Bob has Anns' props: ${bob.info}") // new props 2nd object
    println("Default list: ${default.somebody}")
}

标签: kotlinstack-overflow

解决方案


问题是您Person每次创建一个新实例时都会实例化一个新实例Person。这导致无限调用Person().

在 Java 中,这就像

class Person() {
    new Person()
}

你能看出那里的问题吗?

虽然您不是在构造函数中执行此操作,但您是在创建新实例时初始化的字段上执行此操作。

您可以通过将字段更改为 getter 来修复异常。除非有人真正尝试获取该Person列表,否则不会创建该列表,从而消除了无限循环。

val somebody
    get() = listOf(Person("Copy", "some", 15, 11.1, 1870))

推荐阅读