我发现了一个奇怪的随机错误,下面的StackOverflowError。这是不确定的,所以我很难陷入问题......我有一个Arraylist被包装到一个Collections :: unmodifiableList(...),然后迭代使用for(Val val:myValues )StackOverflowError集合:: unmodifiableList
这怎么可能? Collections中UnmodifiableList实现中的字段都是最终的,所以不能有任何循环依赖(例如A-> B-> A))。不,反映这里不涉及任何......产生这种
java.lang.StackOverflowError
at java.util.Collections$UnmodifiableCollection$1.<init>(Collections.java:1064)
at java.util.Collections$UnmodifiableCollection.iterator(Collections.java:1063)
at java.util.Collections$UnmodifiableCollection$1.<init>(Collections.java:1064)
at java.util.Collections$UnmodifiableCollection.iterator(Collections.java:1063)
at java.util.Collections$UnmodifiableCollection$1.<init>(Collections.java:1064)
at java.util.Collections$UnmodifiableCollection.iterator(Collections.java:1063)
at java.util.Collections$UnmodifiableCollection$1.<init>(Collections.java:1064)
at java.util.Collections$UnmodifiableCollection.iterator(Collections.java:1063)
at java.util.Collections$UnmodifiableCollection$1.<init>(Collections.java:1064)
at com.server.ServerFunction$ServerFunctionResult.evaluateValues(ServerFunctionn.java:562)
at com.server.ServerFunction$ServerFunctionResult.access$300(ServerFunctionn.java:348)
at com.server.ServerFunction.perform(ServerFunction.java:1171)
代码(它已被重新编写,因为我不能在这里张贴实际的代码...):
public final static class ServerFunctionResult
{
private final List<String> myValues;
private final boolean myIsProcessed;
public ServerFunctionResult(List<String> values, boolean isProcessed)
{
// Reduce object retention of empty list objects
myValues = values.isEmpty() ? Collections.EMPTY_LIST : Collections.unmodifiableList(values);
myIsProcessed = isProcessed;
}
public ServerFunctionResult evaluateValues()
{
if (!myIsProcessed)
{
for (String s : myValues) // <-- HERE IT THROWS
{
// Process values
}
return new ServerFunctionResult(myValues, true);
}
return this;
}
}
这是Java 7u51。我试图把我的头围绕这个,但现在我怀疑JVM的bug ...
这个问题是否对别人很熟悉?
你可以在这里添加一些代码吗? – 2015-03-13 06:56:22
看到你的代码会有帮助。 – Yellen 2015-03-13 06:56:51
你最近如何调用它? – Makoto 2015-03-13 07:38:44