【问题标题】:Android object file becomes corruptAndroid 目标文件损坏
【发布时间】:2011-08-14 22:24:38
【问题描述】:

我是 android 开发的新手,一直在尝试创建一些基本的应用程序来适应这个平台。我有一个基本的应用程序,允许用户输入带有定义的单词。主视图是一个列表视图,由从 ArrayList 提供的 ArrayAdapter 填充。当用户选择添加单词时,他们可以输入名称和定义,如果该名称不在列表中,则将其添加到列表中。然后将名称和定义放入 Word 对象(实现链接列表以引用已输入的所有单词的自定义对象)。程序的这部分工作正常,我可以添加任意数量的单词,问题在于保存。我在一个名为 wordlist 的对象中引用了我的单词对象链表的根(该对象也包含 ArrayList)。我已经用我的所有对象实现了 Serializeable,我的计划是每次添加一个单词时保存整个 wordlist 对象。为此,我在 Add_Word 活动(用户选择添加单词时调用的活动)中实现了以下内容:

try                     
{                       
    FileOutputStream fileOut = openFileOutput("words.obj", Context.MODE_PRIVATE);
    ObjectOutputStream objectOut = new ObjectOutputStream(fileOut);
    objectOut.writeObject(Activity_Main.wordlist);
    objectOut.close();
    fileOut.close();
} 
catch (IOException e) 
{
    Context context = getApplicationContext();
    CharSequence text = "File Error";
    int duration = Toast.LENGTH_SHORT;
    Toast toast = Toast.makeText(context, text, duration);
    toast.show();
}

现在这段代码似乎大部分都可以工作,我可以毫无问题地保存和加载我的单词,直到由于某种原因我尝试添加强制的第 22 个单词关闭程序。然后,当我尝试再次打开它时,它会在弹出后立即强制关闭。这对我来说也很奇怪,因为我在启动活动的 onCreate 方法中有一个 try catch 语句,它应该捕获文件的任何问题并简单地重新创建对象:

try
{
            FileInputStream fileIn = this.openFileInput("words.obj");
            ObjectInputStream objectIn = new ObjectInputStream(fileIn);
            wordlist = (Words) objectIn.readObject();
            objectIn.close();
            fileIn.close();
}
catch (Exception e)
{
    wordlist = new Words();
}

如果我在手机上进入我的应用程序并清除数据,它就可以开始备份。我找不到任何有类似问题的人(据我所知)。我确实尝试注释掉文件输出部分,一切正常,只是无法保存。任何想法将不胜感激。 (如果不清楚我正在尝试本地保存到我的程序中)。

我的开发环境:Windows 7 64bit、Eclipse 64bit、Java 64bit(我知道有些人在使用 64bit Java 和 Eclipse 时遇到过问题,但我已经能够在这种环境下开发其他 Java 和 Android 程序)。我使用了 Android 2.1 update 1 模拟器,它在模拟器中做同样的事情。我也有一部 Android 2.1 更新 1 的手机,它有同样的问题,我已经更新到 2.2,仍然是同样的问题。

更新: 感谢您的回复,我查看了日志,这是我在程序崩溃时得到的:

04-28 18:04:27.629:错误/AndroidRuntime(16570):致命异常:主要

04-28 18:04:27.629: 错误/AndroidRuntime(16570): java.lang.StackOverflowError

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.util.IdentityHashMap.findIndex(IdentityHashMap.java:419)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): at java.util.IdentityHashMap.get(IdentityHashMap.java:371)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): at java.io.ObjectOutputStream.dumpCycle(ObjectOutputStream.java:478)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1751)

04-28 18:04:27.629:错误/AndroidRuntime(16570):在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1701)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1665)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:1153)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:420)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1251)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1587)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1859) 04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1701)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1665)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:1153)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:420)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1251)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1587)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1859)

04-28 18:04:27.629:错误/AndroidRuntime(16570):在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1701)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1665)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:1153)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:420)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1251)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1587)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1859)

04-28 18:04:27.629:错误/AndroidRuntime(16570):在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1701)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1665)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:1153)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:420)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1251)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1587)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1859)

04-28 18:04:27.629:错误/AndroidRuntime(16570):在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1701)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1665)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:1153)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:420)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1251)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1587)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1859)

04-28 18:04:27.629:错误/AndroidRuntime(16570):在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1701)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1665)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:1153)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:420)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1251)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1587)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1859)

04-28 18:04:27.629:错误/AndroidRuntime(16570):在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1701)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1665)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:1153)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:420)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1251)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1587)

04-28 18:04:27.629: 错误/AndroidRuntime(16570): 在 java.io.ObjectOutputStream.writeObjectInternal(ObjectOut

因此,我假设存在内存问题,但我仍然对为什么会在如此少量的数据中发生这种情况感到困惑。我会考虑使用数据库,但我希望能有更多关于造成这种情况的想法。

【问题讨论】:

  • Jimbo:正如 Spencer 所说,您确实应该发布 logcat,显示导致强制关闭的异常。

标签: java android file serialization stack-overflow


【解决方案1】:

序列化对象可能会遇到内存问题。您是否尝试过使用数据库?

如果您包含从 LogCat 获得的任何错误,也会很有帮助。

【讨论】:

  • 我已将日志添加到我的原始帖子中,感谢您的回复。
  • 我还没有实现它,但似乎我应该改用数据库。感谢您的帮助。
【解决方案2】:

我想这个问题你可能会感兴趣:StackOverflowError when serializing an object in Java

最简单的解决方案:不要序列化数组列表。考虑使用数据库或简单的数据文件。

【讨论】:

    【解决方案3】:

    就我而言,问题是我有时可能会异步读写。该文件将在读取过程中被覆盖,从而导致 EOFException 或“readObject()”中的内部 IndexOutOfBounds。

    将同步添加到我所有的读写方法都对我有用。

    【讨论】:

      猜你喜欢
      • 2021-01-18
      • 1970-01-01
      • 2011-12-25
      • 1970-01-01
      • 2019-04-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-26
      • 2016-08-09
      相关资源
      最近更新 更多