我是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
因此,据此我假设存在内存问题,但是对于为什么这么少的数据会发生这种情况,我仍然感到困惑。我将研究使用数据库,但是我对引起此问题的任何更多想法表示赞赏。
我是一名优秀的程序员,十分优秀!