android - 应用程序在第一次启动时崩溃,而不是第二次,但它执行相同的代码

标签 android file exception

我遇到了这个奇怪的崩溃,我无法弄清楚。

第一次启动应用程序时,我检查/data/Message.xml 是否存在。如果没有,我就创建一个。 然后,我导航到解析该 xml 文件的页面,但它崩溃了,因为它不存在(因此它没有创建一个)。我查看了数据目录,确实,它没有创建一个。

然后我再次启动该应用程序,它执行相同的代码,而这次它确实创建了 xml 文件。

我不知道为什么它第一次不起作用,该应用程序不会改变任何东西,直到第一次崩溃,并且第二次启动时情况相同。

这是 Android 的东西吗?


更多详细信息:

我检查文件是否可用:

File file = new File(Environment.getDataDirectory() + "/data/com.name.app/files/Message.xml");

if (file.exists() == false) { 创建FirstXML(); }

createFirstXML():

public void createFirstXML() {

File newxmlfile = new File(Environment.getDataDirectory() + "/data/com.name.app/files/Message.xml"); 尝试 { newxmlfile.createNewFile(); } catch (IOException e) { e.printStackTrace(); } FileOutputStream fileos = null; 尝试 { fileos = 新的 FileOutputStream(newxmlfile); } catch (FileNotFoundException e) { e.printStackTrace(); } XmlSerializer 序列化器 = android.util.Xml.newSerializer(); 尝试 { Serializer.setOutput(fileos, "UTF-8"); Serializer.startDocument(null, Boolean.valueOf(true)); Serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);

serializer.startTag(null, "消息");

serializer.startTag(null, "服务"); 序列化器.text(“应用程序”); Serializer.endTag(null, "服务");

serializer.endTag(null, "消息");

serializer.endDocument(); 序列化器.flush(); fileos.close(); } catch (异常 e) { e.printStackTrace(); } }

日志:

java.io.IOException: No such file or directory
 bla
 bla
java.io.FileNotFoundException: /data/data/com.name.app/files/Message.xml (No such file or directory)
 bla
 bla
java.lang.IllegalArgumentException
 bla
 bla
java.io.FileNotFoundException: /data/data/com.name.app/files/Message.xml (No such file or directory)
 bla
 bla
java.io.FileNotFoundException: /data/data/com.name.app/files/Message.xml (No such file or directory)
 bla
 bla

我第二次启动应用程序时,它也找不到 Message.xml(因为它执行 createFirstXML();),但它没有给出异常???

实在是没看懂..

最佳答案

首先,getDataDirectory 可能不是您想要的。它(当前)返回安装包的顶级目录,因此当您将“/data/com.themobilecompany.sosinternational/files/Message.xml”附加到它时,您会得到“/data/data/com.themobilecompany.sosinternational”/files/Message.xml”。查看您的异常信息:

java.io.FileNotFoundException:/data/data/com.themobilecompany.sosinternational/files/Message.xml(没有此类文件或目录)

此目录不存在,这就是您收到异常并且永远无法打开该文件的原因。

最好使用 getFilesDir(),它将返回您的应用的私有(private)文件位置,因此将与可能更改文件系统布局的 future Android 版本兼容。

getFilesDir 当前将返回“/data/com.themobilecompany.sosinternational/”,因此请尝试更改

File newxmlfile = new File(Environment.getDataDirectory() + "/data/com.themobilecompany.sosinternational/files/Message.xml");

文件 newxmlfile = new File(Context.getFilesDirectory() + "/files/Message.xml");

如果文件目录尚不存在,请不要忘记创建它。

您是否在 onCreate 中运行此代码,或者它是由 onCreate 或类似的东西触发的?如果是这样,正常的 Activity 生命周期将意味着您的代码不会在每次启动应用程序时运行。 onCreate 将在您的 Activity 创建时被调用,大多数情况下,当您“退出”(即按后退按钮)时,您只是暂停您的 Activity。当您重新启动它时,Android 只是重用现有的挂起的 Activity ,因此您的 onCreate 不会在您的应用程序的后续执行中被调用 - 这就是为什么异常并不总是发生的原因。

关于android - 应用程序在第一次启动时崩溃,而不是第二次,但它执行相同的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4747100/

相关文章:

c# - C# 中的异常与 "if"

python - Python : How to shrink this code? 识别抛出异常的数据

android - React Native 生产级代码和错误处理

java - 为 TextView 赋值时出现 NullPointer 异常

java - 关于上下文 FLAG_ACTIVITY_NEW_TASK 的错误

C 将 PPM 图像显示为文本

python - Python 中的文件校验和

java - 如何在用户选择首选项后重新运行 onCreate。

JAVA:如何在二进制文件中正确存储对象?不覆盖

java - Java “try without catch”和 “catch without try”