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
相关产品推荐
相关产品推荐

