2012-09-11 106 views
1

我有一個方法,試圖寫入到SD卡上的文本文件在AlarmReceiver中。 之前,我把它移動到AlarmReceiver的方法完美地工作,但現在卻在logcat中以下崩潰:SD卡寫入方法崩潰在AlarmReceiver

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() 
+1

'string'是什麼?你檢查過它是否爲空? – user370305

+0

http://www.java-samples.com/showtutorial.php?tutorialid=1523 –

+0

你有沒有在清單中定義你的接收器? – breceivemail

回答

0

字符串不是空

這裏是源代碼片段出現錯誤的位置,用行號:

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

,個別語句拋出一個NullPointerException唯一方法是,如果strnull。因此,儘管您可能認爲string不是null,但您的堆棧跟蹤指示了其他情況。

+0

或者如果osw1爲空。 –

+0

@PhilipSheard:不,因爲'NullPointerException'會在他的代碼中產生,而不是在'java.io.Writer'的第141行。 – CommonsWare

+0

@Commonsware:尊重,我不同意你的看法。我使用System.out.println(string)將此變量的內容打印到Logcat中;它絕對不是空的。 – Kevmeister