这段代码导致了stackOverflow异常:
ISerializer serializer = buildSerializer(TestDataProvider.getAuthor());
ASObject result = (ASObject) serializer.serialize();
assert result.isNotLazyProxy
StackOverflow被抛出以下行:
assert result.isNotLazyProxy
。注意,isNotLazyProxy
方法从不实际调用。isNotLazyProxy
是一个扩展方法(在groovy中叫什么?),其定义如下:/**
* Asserts that this ASObject is not a lazy loaded proxy,
* ie - that all of it's properties' values have been included
*/
ASObject.metaClass.isNotLazyProxy = { ->
assert delegate[HibernateProxyConstants.PROXYINITIALIZED] == true
return true;
}
但是,在该关闭的第一行设置一个断点表明它永远不会被调用。
而是抛出了StackOverflow:
java.lang.StackOverflowError
at java.lang.System.arraycopy(Native Method)
at java.lang.String.getChars(String.java:855)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:391)
at java.lang.StringBuffer.append(StringBuffer.java:224)
at java.lang.StringBuffer.<init>(StringBuffer.java:104)
at org.codehaus.groovy.runtime.InvokerHelper.formatMap(InvokerHelper.java:557)
at org.codehaus.groovy.runtime.InvokerHelper.format(InvokerHelper.java:530)
at org.codehaus.groovy.runtime.InvokerHelper.formatList(InvokerHelper.java:602)
at org.codehaus.groovy.runtime.InvokerHelper.format(InvokerHelper.java:527)
at org.codehaus.groovy.runtime.InvokerHelper.formatMap(InvokerHelper.java:575)
剪断
我不确定它是否相关,但是
ASObject
是Map
的子类,并且它的内容可能具有引用其自身其他键的属性。我本来以为这是相关的,只是StackOverflow似乎表明groovy正在遍历地图的成员。
这是怎么回事?为什么会发生此stackoverflow?
最佳答案
assert result.isNotLazyProxy
可能没有执行您想要的操作。
在常规中,map.somehing
被翻译为map.get(something)
。参见http://groovy.codehaus.org/JN1035-Maps:
断言map2.class == null
// field语法始终引用key的值,即使它不存在
//使用getClass()代替地图类
assert map2.getClass()== LinkedHashMap //正在使用的地图类型
因此,使用assert result.isNotLazyProxy()
。
当然,在您的情况下,result.isNotLazyProxy
应该返回null,并且assert result.isNotLazyProxy
断言应该失败。当该断言失败时,groovy将显示一个断言错误以及该映射。在您的情况下,格式化地图由于某种原因而失败。
失败的原因:
它是一个known bug,请参见example。如我所见,它与ASObject无关,因为它不使用任何列表。