java - Android目标文件损坏

标签 java android file serialization stack-overflow

我是android开发的新手,一直在尝试创建一些基本的应用程序以适应平台。我有一个基本的应用程序,允许用户输入带有定义的单词。主视图是一个由ArrayAdapter填充的列表视图,该ArrayAdapter是从ArrayList馈送的。当用户选择添加单词时,他们可以输入名称和定义,如果该名称尚未在列表中,则会将其添加到列表中。然后将名称和定义放入Word对象(实现链接列表以引用所有已输入单词的自定义对象)中。程序的这一部分工作正常,我可以添加任意多个单词,问题在于保存。我在一个称为wordlist的对象中引用了我的单词对象的链接列表的根(该对象还保存ArrayList)。我已经对所有对象实现了Serializeable,我的计划是每次添加单词时都保存整个单词表对象。为此,我在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 update 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):at 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):at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1751)

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

04-28 18:04:27.629:错误/ AndroidRuntime(16570):at 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):at 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):at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1859)
04-28 18:04:27.629:错误/ AndroidRuntime(16570):at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1701)

04-28 18:04:27.629:错误/ AndroidRuntime(16570):at 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):at 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):at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1859)

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

04-28 18:04:27.629:错误/ AndroidRuntime(16570):at 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):at 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):at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1859)

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

04-28 18:04:27.629:错误/ AndroidRuntime(16570):at 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):at 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):at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1859)

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

04-28 18:04:27.629:错误/ AndroidRuntime(16570):at 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):at 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):at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1859)

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

04-28 18:04:27.629:错误/ AndroidRuntime(16570):at 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):at 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):at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1859)

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

04-28 18:04:27.629:错误/ AndroidRuntime(16570):at 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

因此,据此我假设存在内存问题,但是对于为什么这么少的数据会发生这种情况,我仍然感到困惑。我将研究使用数据库,但是我对引起此问题的任何更多想法表示赞赏。

最佳答案

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

如果您要包括从LogCat得到的任何错误,这也将很有帮助。

关于java - Android目标文件损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5822798/

相关文章:

java - 如何 'getConstructor',其中构造函数签名包含java数组

java - 更改 Activity 的主题/样式后重绘/刷新布局

java - Files.copy 上的 AccessDeniedException 来自 Java NIO2 中的临时文件

Bash星号会忽略以 '.'开头的文件吗?

java - 安卓谷歌 : Logout google in another activity

java - 从静态类型到动态类型

java - Apache 和 J2EE 共享安全领域/登录、单点登录

android - WebSocket 和 Rx Java

android - 将 include 标签与已经存在的 GridView 一起使用

c++ - C++中的文件路径