2013-03-04 132 views
1

所以我正在運行一個應用程序,當我嘗試寫入文件時會創建NullPointerException。爲什麼FileOutputStream會產生NullPointerException?

當用戶按下新的設置按鈕時,我的第一個活動(見下文)調用NewSet活動。當我嘗試在NewSet活動中編寫輸入時,它會引發NullPointerException。打印出fileOut顯示我的值爲null,它不應該。 fileOut是全局聲明的,但在onCreate中初始化。下面兩個類是。 (...表示省略碼由於是不相關的。)

public class MainActivity extends Activity { 
    static ArrayList sets; 
    FileOutputStream fileOut; 
    BufferedReader read; 
    String line; 
    ArrayAdapter<String> adapter; 
    ListView listView; 
    Intent newSetIntent; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     setContentView(R.layout.activity_main); 
     newSetIntent=new Intent(this,NewSet.class); 

     listView=(ListView)findViewById(R.id.setList); 
     sets=new ArrayList(); 
     try { 
      read=new BufferedReader(new BufferedReader(new InputStreamReader(openFileInput("SETS.txt")))); 
      fileOut=openFileOutput("SETS.txt",Context.MODE_APPEND); 
     } catch (FileNotFoundException e) { 
      System.out.println("File not found"); 
      try { 

       fileOut.write("".getBytes()); 
      } catch (IOException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      System.out.println("IOE"); 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     getSets(); 
     toList(); 
     super.onCreate(savedInstanceState); 
    } 

    ... 

    public void newSet(String newSetName){ 
     System.out.println(newSetName); 
     sets.add(newSetName); 

     try { 
      fileOut=openFileOutput("SETS.txt",Context.MODE_APPEND); 
      fileOut.write(newSetName.getBytes()); 
      fileOut.write("\n".getBytes()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     catch (NullPointerException NPE){ 
      System.out.println(fileOut); 
      NPE.printStackTrace(); 
     } 


    } 
} 





public class NewSet extends Activity { 

    EditText input; 
    String setName; 
    MainActivity main; 
    ... 
    public void submit(View view){ 
     setName=input.getText().toString(); 
     System.out.println("CREATING SET:"+setName); 
     main.newSet(setName); 
     finish(); 

    } 

} 

完整堆棧跟蹤

03-03 23:08:42.183: W/System.err(8435): java.lang.NullPointerException 
03-03 23:08:42.183: W/System.err(8435):  at android.content.ContextWrapper.openFileOutput(ContextWrapper.java:173) 
03-03 23:08:42.183: W/System.err(8435):  at com.ollien.flashcards.MainActivity.newSet(MainActivity.java:112) 
03-03 23:08:42.183: W/System.err(8435):  at com.ollien.flashcards.NewSet.submit(NewSet.java:35) 
03-03 23:08:42.193: W/System.err(8435):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-03 23:08:42.193: W/System.err(8435):  at java.lang.reflect.Method.invoke(Method.java:511) 
03-03 23:08:42.193: W/System.err(8435):  at android.view.View$1.onClick(View.java:3594) 
03-03 23:08:42.193: W/System.err(8435):  at android.view.View.performClick(View.java:4204) 
03-03 23:08:42.193: W/System.err(8435):  at android.view.View$PerformClick.run(View.java:17355) 
03-03 23:08:42.193: W/System.err(8435):  at android.os.Handler.handleCallback(Handler.java:725) 
03-03 23:08:42.203: W/System.err(8435):  at android.os.Handler.dispatchMessage(Handler.java:92) 
03-03 23:08:42.203: W/System.err(8435):  at android.os.Looper.loop(Looper.java:137) 
03-03 23:08:42.203: W/System.err(8435):  at android.app.ActivityThread.main(ActivityThread.java:5226) 
03-03 23:08:42.203: W/System.err(8435):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-03 23:08:42.203: W/System.err(8435):  at java.lang.reflect.Method.invoke(Method.java:511) 
03-03 23:08:42.203: W/System.err(8435):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 
03-03 23:08:42.203: W/System.err(8435):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 
03-03 23:08:42.203: W/System.err(8435):  at dalvik.system.NativeStart.main(Native Method) 
+2

你可以發佈完整的堆棧跟蹤嗎? – 2013-03-04 04:20:57

+0

你在這裏,對不起。 http://pastebin.com/3S2dLpid – ollien 2013-03-04 04:25:13

+0

post log cat trace – Pragnani 2013-03-04 04:25:24

回答

0

例外是android.content.ContextWrapper類得到拋出。方法是:

public FileOutputStream openFileOutput(String name, int mode) throws FileNotFoundException 
{ 
    return mBase.openFileOutput(name, mode); // Line number 173 
} 

在這裏,我看到這可能會導致空指針異常的唯一可能性就是數據成員mBase類型的Context爲NULL。

您可以檢查數據成員是否爲非空值Context

+0

我很抱歉,但您是通過檢查上下文數據成員意味着什麼? – ollien 2013-03-04 04:54:14

相關問題