目录不存在时应用程序崩溃

时间:2014-04-18 12:53:46

标签: android file file-io android-file

嗨,我在Android上相当业余,所以我可能没有意识到明显的事情。

我有一个方法,用一个特定目录中的苍蝇列表填充一个全局文件数组变量。问题是如果目录已经通过使用我的应用程序保存文件在那里一切正常,但是当用户没有完成时,假设弹出错误消息说他们没有保存文件爱好。

我检查目录是否存在,但是当目录尚未创建时应用程序崩溃。

这是我的代码看起来像任何协助将不胜感激

    private void getTemplates()
{       
    //Gets file directory for saved templates
    File finalMarkTemplateDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Final Mark Templates");

    //Checks if path exists in other word if any templates have been saved before
    if(finalMarkTemplateDir.exists())
    {
        templatePaths = finalMarkTemplateDir.listFiles();
    }
    else
    {
        Toast.makeText(this, "No previous templates have been saved.", Toast.LENGTH_LONG).show();
        setResult(RESULT_CANCELED);
        finish();
    }
}

2 个答案:

答案 0 :(得分:0)

我太业余了,您还没有在代码中创建文件,调用新文件()方法不会创建文件。请检查出来

try {
            finalMarkTemplateDir.createNewFile();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

答案 1 :(得分:0)

当我调用setResult并完成方法时,我设法解决了我的问题我没有意识到程序的流程返回到我的onCreate方法,这意味着onCreate中的其余方法调用仍然被调用,并且它们需要templatePaths数组。

所以基本上我认为完成会停止处理并返回到调用类(使用startActivityForResult)。相反,我现在从我的onCreate调用finish并使用布尔值来确定我是否可以成功访问该目录。

    @Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.dialog_load_template);

    boolean fileLoadStatus = getTemplates();

    if(fileLoadStatus)
    {
        populateTemplateList(templatePaths);
    }
    else
    {
        setResult(RESULT_CANCELED);
        finish();
    }
}

    private boolean getTemplates()
{   
    boolean fileLoadStatus = false;

    //Gets file directory for saved templates
    File finalMarkTemplateDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Final Mark Templates");

    //Checks if path exists in other word if any templates have been saved before
    if(finalMarkTemplateDir.isDirectory())
    {
        templatePaths = finalMarkTemplateDir.listFiles();
        fileLoadStatus = true;
    }
    else
    {
        Toast.makeText(this, "No previous templates have been saved.", Toast.LENGTH_LONG).show();           
    }

    return fileLoadStatus;

}