You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins Groovy访问类属性时出现StackOverflowError问题求助

问题原因与解决办法

哈哈,这个问题我太熟了!你碰到的java.lang.StackOverflowError是无限递归调用导致的,根源出在Groovy的属性访问特性上:

在Groovy里,当你写this.name的时候,它并不是直接访问类里的name字段,而是会自动调用对应的getName() getter方法。但你自己手动定义了getName()方法,里面又返回this.name——这就形成了死循环:
this.name → 调用getName() → getName()又返回this.name → 再次调用getName()…… 循环往复直到栈被撑爆,抛出StackOverflowError。

另外你代码里的println行没写完,应该是println 'Erstellte Komponente: ' + komponente,不过这只是小疏漏,真正的问题是上面说的递归。


两种快速修复方案

方案1:删掉自定义的getName()方法

Groovy会自动为类的成员属性生成标准的getter和setter,完全不需要你手动写。直接移除getName()方法就搞定了:

class Komponente {
    String name
    Komponente(name) {
        this.name = name
    }
    String toString() {
        return 'Klasse: Komponente (name: [' + this.name +'])'
    }
}
Komponente komponente = new Komponente('Testkomponente')
println 'Erstellte Komponente: ' + komponente

方案2:直接访问底层字段(保留自定义getter的情况)

如果你确实需要自定义getName()方法,那要在所有地方绕过Groovy的属性访问机制,直接用this.@name访问底层Java字段,避免触发getter调用:

class Komponente {
    String name
    Komponente(name) {
        this.@name = name
    }
    String getName() {
        return this.@name
    }
    String toString() {
        return 'Klasse: Komponente (name: [' + this.@name +'])'
    }
}
Komponente komponente = new Komponente('Testkomponente')
println 'Erstellte Komponente: ' + komponente

简单说:在Groovy里,obj.name是属性访问(走getter/setter),obj.@name是直接访问字段,这俩差别很大哦!

内容的提问来源于stack exchange,提问作者bish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:16:13