我有两个相似的对象,都来自同一类,它们非常相同。
我想将它们从一项活动传递给另一项活动。
它在大多数情况下都能正常运行,但是我从许多android 4.4设备上收到了崩溃报告,其中某个特定对象引发了StackOverflowError。
我已经在Android 4.4上进行了检查,并且我可以随时重复该错误。
我已经读到它可能是由两个问题引起的:
我已使用此func记录了两个可序列化的对象:
public static String sizeof(Object obj) throws IOException {
ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteOutputStream);
objectOutputStream.writeObject(obj);
objectOutputStream.flush();
objectOutputStream.close();
return (byteOutputStream.toByteArray().length/1024.f) + " Kbytes";
}
我有一个奇怪的输出,因为较大的对象可以正常工作10 \ 10次,并且SMALLER对象每次都会引发StackOverflowError。
I / BYTE_SIZE:有问题的对象,大小:75.79004 KB
当我尝试使用带有序列化的Intent在活动之间传递堆栈时,会导致堆栈溢出:
03-15 13:59:18.492 6132-6132 / hu.adam.myapp.pack E / AndroidRuntime:致命异常:main
进程:hu.adam.myapp.pack,PID:6132 java.lang.StackOverflowError 在java.io.ObjectInputStream.checkReadPrimitiveTypes(ObjectInputStream.java:394) 在java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:745) 在java.io.ObjectInputStream.readObject(ObjectInputStream.java:1981) 在java.io.ObjectInputStream.readObject(ObjectInputStream.java:1938) 在java.io.ObjectInputStream.readFieldValues(ObjectInputStream.java:1115) 在java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:455) 在java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1347) 在java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1244) 在java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1833) 在java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:762) 在java.io.ObjectInputStream.readObject(ObjectInputStream.java:1981) 在java.io.ObjectInputStream.readObject(ObjectInputStream.java:1938) 在java.io.ObjectInputStream.readFieldValues(ObjectInputStream.java:1115) 在java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:455) 在java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1347) 在java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1244) 在java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1833) 在java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:762) 在java.io.ObjectInputStream.readObject(ObjectInputStream.java:1981) 在java.io.ObjectInputStream.readObject(ObjectInputStream.java:1938) 在java.io.ObjectInputStream.readFieldValues(ObjectInputStream.java:1115) 在java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:455) 在java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1347) 在java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1244) 在java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1833) 在java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:762) 在java.io.ObjectInputStream.readObject(ObjectInputStream.java:1981) 在java.io.ObjectInputStream.readObject(ObjectInputStream.java:1938) 在java.io.ObjectInputStream.readFieldValues(ObjectInputStream.java:1115) 在java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:455) 在java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1347) 在java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1244) 在java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1833) 在java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:762) 在java.io.ObjectInputStream.readObject(ObjectInputStream.java:1981) 在java.io.ObjectInputStream.readObject(ObjectInputStream.java:1938) 在java.util.HashMap.readObject(HashMap.java:1023) 在java.lang.reflect.Method.invokeNative(本机方法) 在java.lang.reflect.Method.invoke(Method.java:515) 在java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1332) 在java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1244) 在java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1833) 在java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:762) 在java.io.ObjectInputStream.readObject(ObjectInputStream.java:1981) 在java.io.ObjectInputStream.readObject(ObjectInputStream.java:1938) 在java.io.ObjectInputStream.readFieldValues(ObjectInputStream.java:1115) 在java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:455) 在java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1347) 在java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1244) 在java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1833) 在java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:762) 在java.io.ObjectInputStream.readObject(ObjectInputStream.java:1981) 在java.io.ObjectInputStream.readObject(ObjectInputStream.java:1938) 在java.io.ObjectInputStream.readFieldValues(ObjectInputStre
I / BYTE_SIZE:大对象,大小:188.49121 KB
所以我的问题:
如果它与大小无关-一定是与递归相关的错误-但是我怎么能准确地找到它呢?据我所知,我不使用任何圆形链接,该对象就像金字塔的层次结构,但是我当然可能是错的。
任何建议都应该从哪里开始搜索或应该怎么做?
谢谢。