这段代码导致了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)


剪断

我不确定它是否相关,但是ASObjectMap的子类,并且它的内容可能具有引用其自身其他键的属性。

我本来以为这是相关的,只是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无关,因为它不使用任何列表。

10-05 18:19