【发布时间】: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