【发布时间】:2018-02-12 06:28:28
【问题描述】:
我有一个显示奇怪行为的 android 应用程序。 我有一个从文件反序列化对象的方法。以下是我正在使用的代码:
public static Object readData(Context context, String fileName)
{
synchronized (context) {
ObjectInputStream input = null;
Object object = null;
if (fileExists(context, fileName)) {
try {
input = new ObjectInputStream(context.openFileInput(fileName));
object = input.readObject();
Log.v(Constant.TAG, "Writable object has been loaded from file "+fileName);
} catch (IOException e) {
Log.e(Constant.TAG, e.getMessage(), e);
} catch (ClassNotFoundException e) {
Log.e(Constant.TAG, e.getMessage(), e);
} finally {
try {
if (input != null)
input.close();
} catch (IOException e) {
Log.e(Constant.TAG, e.getMessage(), e);
}
}
}
return object;
}
}
通常它运行良好,但是当有人最小化我的应用程序并在某个时间重新打开后,它会崩溃。从崩溃报告中我发现它在上面代码的下面一行中抛出了IllegalArgumentException
object = input.readObject();
我浏览了ObjectInputStream.readObject 的文档,但它没有说明可以抛出IllegalArgumentException 的情况。
只有当用户从后台带来应用程序时才会发生这种情况。它在应用启动时运行良好(启动是指应用未运行时,即使在后台也不运行)。
PS:有一些崩溃报告在同一行显示ClassCastException,这更奇怪,因为我没有投射,只读到Object。
更新
堆栈跟踪
java.lang.RuntimeException:
at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2423)
at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2483)
at android.app.ActivityThread.access$900 (ActivityThread.java:153)
at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1349)
at android.os.Handler.dispatchMessage (Handler.java:102)
at android.os.Looper.loop (Looper.java:148)
at android.app.ActivityThread.main (ActivityThread.java:5441)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:738)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:628)
Caused by: java.lang.IllegalArgumentException:
at java.lang.reflect.Field.set (Native Method)
at java.io.ObjectInputStream.readFieldValues (ObjectInputStream.java:1127)
at java.io.ObjectInputStream.defaultReadObject (ObjectInputStream.java:454)
at java.io.ObjectInputStream.readObjectForClass (ObjectInputStream.java:1345)
at java.io.ObjectInputStream.readHierarchy (ObjectInputStream.java:1242)
at java.io.ObjectInputStream.readNewObject (ObjectInputStream.java:1835)
at java.io.ObjectInputStream.readNonPrimitiveContent (ObjectInputStream.java:761)
at java.io.ObjectInputStream.readObject (ObjectInputStream.java:1983)
at java.io.ObjectInputStream.readObject (ObjectInputStream.java:1940)
at com.pixyfisocial.pixyfi.util.IOUtil.readData (IOUtil.java:245)
at com.pixyfisocial.Login.getLoggedInUserInfoFromCache (Login.java:313)
at com.pixyfisocial.Login.startApp (Login.java:124)
at com.pixyfisocial.Login.onCreate (Login.java:98)
at android.app.Activity.performCreate (Activity.java:6303)
at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1108)
at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2376)
【问题讨论】:
-
请提供完整的(未经编辑的)异常消息和堆栈跟踪
-
我不明白为什么要否决这个问题。
-
我没有投反对票。但是,我可以看到多种拒绝投票的原因,包括不包括 MVCE,以及花费很长时间来发布堆栈跟踪。
-
我的意思是你。只是想知道原因
-
你在一个(现已删除的)“答案”中问过这个问题:“我怎样才能控制它?从我的侧面对象是从应用程序写入的。这肯定不会改变表示”我>
标签: java android serialization illegalargumentexception objectinputstream