【问题标题】:SD card write method crashing in AlarmReceiverSD卡写入方法在AlarmReceiver中崩溃
【发布时间】:2012-09-11 10:46:40
【问题描述】:

我有一个方法尝试在 AlarmReceiver 中写入 SD 卡上的文本文件。 在我将它移到 AlarmReceiver 之前,该方法运行良好,但现在它在 Logcat 中因以下内容而崩溃:

09-11 10:36:44.395: D/AndroidRuntime(946): Shutting down VM
09-11 10:36:44.395: W/dalvikvm(946): threadid=1: thread exiting with uncaught exception         (group=0x409c01f8)
09-11 10:36:44.425: E/AndroidRuntime(946): FATAL EXCEPTION: main
09-11 10:36:44.425: E/AndroidRuntime(946): java.lang.RuntimeException: Unable to start receiver com.exercise.AndroidSYSinfo.AlarmReceiver: java.lang.NullPointerException
09-11 10:36:44.425: E/AndroidRuntime(946):  at android.app.ActivityThread.handleReceiver(ActivityThread.java:2126)
09-11 10:36:44.425: E/AndroidRuntime(946):  at android.app.ActivityThread.access$1500(ActivityThread.java:123)
09-11 10:36:44.425: E/AndroidRuntime(946):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1197)
09-11 10:36:44.425: E/AndroidRuntime(946):  at android.os.Handler.dispatchMessage(Handler.java:99)
09-11 10:36:44.425: E/AndroidRuntime(946):  at android.os.Looper.loop(Looper.java:137)
09-11 10:36:44.425: E/AndroidRuntime(946):  at android.app.ActivityThread.main(ActivityThread.java:4424)
09-11 10:36:44.425: E/AndroidRuntime(946):  at java.lang.reflect.Method.invokeNative(Native Method)
09-11 10:36:44.425: E/AndroidRuntime(946):  at java.lang.reflect.Method.invoke(Method.java:511)
09-11 10:36:44.425: E/AndroidRuntime(946):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
09-11 10:36:44.425: E/AndroidRuntime(946):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
09-11 10:36:44.425: E/AndroidRuntime(946):  at dalvik.system.NativeStart.main(Native Method)
09-11 10:36:44.425: E/AndroidRuntime(946): Caused by: java.lang.NullPointerException
09-11 10:36:44.425: E/AndroidRuntime(946):  at java.io.Writer.write(Writer.java:141)
09-11 10:36:44.425: E/AndroidRuntime(946):  at com.exercise.AndroidSYSinfo.AlarmReceiver.writeSD(AlarmReceiver.java:318)
09-11 10:36:44.425: E/AndroidRuntime(946):  at com.exercise.AndroidSYSinfo.AlarmReceiver.onReceive(AlarmReceiver.java:182)
09-11 10:36:44.425: E/AndroidRuntime(946):  at android.app.ActivityThread.handleReceiver(ActivityThread.java:2119)

这是相关代码:

  public void writeSD(Context context) 
 {
      //Toast.makeText(context,"Saving sdcardstats.txt..." , Toast.LENGTH_SHORT).show();
         //  
         // Write SDCard stats to file
         //
         try
           {
           FileOutputStream fOut1 = context.openFileOutput("sdcardstats.txt", Context.MODE_PRIVATE);
           OutputStreamWriter osw1 = new OutputStreamWriter(fOut1);       
           osw1.write(string);
           osw1.flush();
           osw1.close();    

           }
           catch (IOException ioe)
           {

           ioe.printStackTrace();
           } //end catch


 }  // end of writeSD()

【问题讨论】:

  • 什么是string?你检查过它是否为空吗?
  • 您是否在清单中定义了您的接收器?
  • 这一行是什么: ....writeSD(AlarmReceiver.java:318) -- 编辑:还有两件事,1) 你有写入 SD 的权限吗?此外,您不应该在接收器中执行文件 IO,最好启动服务。
  • 嗨,字符串不为空,并且接收者在清单中定义,是的,我在清单中有 WRITE_EXTERNAL_STORAGE

标签: android alarmmanager android-sdcard


【解决方案1】:

字符串不为空

这是失败的源代码sn-p,带有行号:

140    public void write(String str) throws IOException {
141        write(str, 0, str.length());
142    }

单个语句抛出NullPointerException唯一方式是strnull。因此,虽然您可能认为 string 不是 null,但您的堆栈跟踪表明并非如此。

【讨论】:

  • @PhilipSheard: 不,因为NullPointerException 会源自他的代码,而不是java.io.Writer 的第141 行。
  • @Commonsware:恕我直言,我不同意你的观点。我已使用 System.out.println(string); 将此变量的内容打印到 Logcat;它绝对不为空。
  • @Kevmeister:那么您在调用write() 之前将值更改为null。或者您有多个名为 string 的变量,而这个变量在当前范围内是 null。同样,唯一会导致java.io.Writer 的第141 行出现NullPointerException 的情况是,如果提供的要写入的字符串是null
  • @Commonsware。谢谢你 - 我现在可以看到问题,但它似乎已经打开了另一罐蠕虫。字符串变量的值来自 onReceive() 方法,该方法的返回类型为 null。如果我将返回类型更改为字符串,Eclipse 会提示我将方法头返回类型更改为字符串,然后显示消息“返回类型与 AsyncTask.doInBackground(Void[]) 不兼容”
  • @Kevmeister:由于这些都没有引用您的问题中的任何内容(what AsyncTask?),并指出了一些不可能(您不能拥有 a 的“返回类型”)方法是null),我不知道如何进一步帮助您。
猜你喜欢
  • 2023-04-03
  • 2011-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-11
相关资源
最近更新 更多