为什么我在以下代码中获取空指针异常?

时间:2013-05-04 09:28:32

标签: android nullpointerexception

这是我的代码,我在函数writeFile()中获取NPE。关键是将String传递给writeFile()方法,然后使用createFile()创建文件并将String写入新创建的文件。

文件在目录中成功创建,但没有写入任何内容。 String也显示了Logcat的输出,所以它清楚它不是一个空字符串。

public File createFile( ){
    File storageLocation = new File( Environment.getExternalStorageDirectory(), path);
    storageLocation.mkdirs();
    if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
        Toast.makeText(context, "Cannot use storage.", Toast.LENGTH_SHORT).show();
    }
    try{
         File file = new File(storageLocation, getFileName()+".xml");
         file.createNewFile();
    }
    catch( IOException e){
        e.printStackTrace();
    }
     return file;
}

public String getFileName( ){
    SimpleDateFormat sdf = new SimpleDateFormat("dd-mm-yyy",Locale.UK);
    return sdf.format(c.getTime( ));
}

 public void writeFile( String text ){
     try{
line 56>>   FileOutputStream fos = new FileOutputStream( createFile( ).getAbsoluteFile());
            out = new DataOutputStream(fos);
            out.writeUTF(text);
            Toast.makeText(context.getApplicationContext(), "Backup Successfull.", Toast.LENGTH_LONG).show();
            out.close();
     }
     catch( IOException e){
         e.printStackTrace();
      Toast.makeText(context.getApplicationContext(), "Backup Failed.", Toast.LENGTH_LONG).show(); 
     }
     catch( NullPointerException e){
         e.printStackTrace();
          Toast.makeText(context.getApplicationContext(), "Backup Failed.", Toast.LENGTH_LONG).show(); 
         }
 }

编辑: 权限设置为

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

这是来自Logcat的日志:

05-04 09:21:47.276: W/System.err(1137): java.lang.NullPointerException
05-04 09:21:47.286: W/System.err(1137):     at com.codepalette.ceeq.FileManager.writeFile(FileManager.java:56)
05-04 09:21:47.286: W/System.err(1137):     at  com.codepalette.ceeq.BackupManager.backCallLogs(BackupManager.java:50)
05-04 09:21:47.286: W/System.err(1137):     at com.codepalette.ceeq.BackupManager.takeBackup(BackupManager.java:25)
05-04 09:21:47.296: W/System.err(1137):     at com.codepalette.ceeq.Home$2.onClick(Home.java:154)

3 个答案:

答案 0 :(得分:1)

您的代码中存在错误,我怀疑您是否可以运行它。 变量文件(File)在声明时不能返回,它超出了范围。

尝试改变它:

try {
     File file = new File(storageLocation, getFileName()+".xml");
     file.createNewFile();
     return file;
}
catch( IOException e){
    e.printStackTrace();
}
return null;

答案 1 :(得分:0)

您是否添加了相关权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

在清单文件中,写入外部存储?

答案 2 :(得分:0)

您是否初始化了在getFileName()中使用的日历对象?