2011-07-22 50 views
2

我正在做的是: 我有一個類「Welcome」,它調用另一個類「textWriter」,它包含一個方法「write」。歡迎傳遞兩個字符串「寫入」,「name」是要寫入的文本文件的名稱,「something」是要打印的內容。在寫入文本文件時遇到困難

我一直在prt = new PrintStream(output);

及彼空指針錯誤是logcat的

07-22 16:40:22.561: ERROR/AndroidRuntime(2245): FATAL EXCEPTION: main 
07-22 16:40:22.561: ERROR/AndroidRuntime(2245): java.lang.NullPointerException 
07-22 16:40:22.561: ERROR/AndroidRuntime(2245):  at android.content.ContextWrapper.openFileOutput(ContextWrapper.java:158) 
07-22 16:40:22.561: ERROR/AndroidRuntime(2245):  at com.rhobot.budget.textWriter.write(textWriter.java:24) 
07-22 16:40:22.561: ERROR/AndroidRuntime(2245):  at com.rhobot.budget.Welcome.setSubChoices(Welcome.java:37) 
07-22 16:40:22.561: ERROR/AndroidRuntime(2245):  at com.rhobot.budget.Welcome$1.onClick(Welcome.java:76) 
07-22 16:40:22.561: ERROR/AndroidRuntime(2245):  at android.view.View.performClick(View.java:2408) 
07-22 16:40:22.561: ERROR/AndroidRuntime(2245):  at android.view.View$PerformClick.run(View.java:8816) 
07-22 16:40:22.561: ERROR/AndroidRuntime(2245):  at android.os.Handler.handleCallback(Handler.java:587) 
07-22 16:40:22.561: ERROR/AndroidRuntime(2245):  at android.os.Handler.dispatchMessage(Handler.java:92) 
07-22 16:40:22.561: ERROR/AndroidRuntime(2245):  at android.os.Looper.loop(Looper.java:123) 
07-22 16:40:22.561: ERROR/AndroidRuntime(2245):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
07-22 16:40:22.561: ERROR/AndroidRuntime(2245):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-22 16:40:22.561: ERROR/AndroidRuntime(2245):  at java.lang.reflect.Method.invoke(Method.java:521) 
07-22 16:40:22.561: ERROR/AndroidRuntime(2245):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
07-22 16:40:22.561: ERROR/AndroidRuntime(2245):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
07-22 16:40:22.561: ERROR/AndroidRuntime(2245):  at dalvik.system.NativeStart.main(Native Method) 

這裏是歡迎類:

public class Welcome extends Activity 
{ 
P p = new P(); //shared prefs helper 
loadArray la = new loadArray(); //array loader 
textWriter tw = new textWriter(); 
private EditText txtBalance; 
private Button btnEnter; 
int subItemCount, addItemCount; 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.welcomescreen); 
    capture(); 
} 
public static String sub_choice_key = "sub_choice_key.txt"; 
public static String sub_compare = "sub_compare.txt"; 
public static String add_choice_key = "add_choice_key.txt"; 
public static String add_compare = "add_compare.txt"; 

public void setSubChoices() throws FileNotFoundException { 
    // TODO create a master list of choices 
    tw.write(sub_choice_key,"-1"); 
    tw.write(sub_choice_key,"-2"); 
    tw.write(sub_choice_key,"-3"); 
    tw.write(sub_compare,"-1"); 
    tw.write(sub_compare,"-2"); 
    tw.write(sub_compare,"-3"); 
    p.pisI("subItemCount", 3, this); 
}... 

這裏是TextWriter類

public class textWriter extends Activity{ 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
} 
public void write(String name, String something) { 

    try { 
     FileOutputStream output; 
     output = openFileOutput(name,MODE_APPEND); 
     PrintStream prt; 
     prt = new PrintStream(output); 
     prt.println(something); 
     prt.close(); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

編號喜歡強調這些是兩個不同的文件以及我正在導入我相信的所有正確的東西..我也有我的Android清單中的行 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

我在做什麼錯?是上下文嗎?或缺乏?如果是的話,我應該如何執行它?

我這樣做是因爲我想在其他程序中使用這個textWrite作爲一種簡單(不太混亂)的寫入數據的方式。在我的主要中,如果我這樣做,它可以節省大約50行代碼。
在此先感謝- Tricknology

回答

1

正如大衛所言,問題在於缺乏有效的上下文。

一個簡單的解決方法,如果你希望你的階級結構將保持不變,你可以做的是從textWriter刪除extends Activity,而是通過在構造一個背景下,即:

public class textWriter{ 
    private Context m_context; 

    public textWriter(Context ctx) { 
     m_context = ctx; 
    }  
    public void write(String name, String something) { 

     try { 
      FileOutputStream output; 
      output = m_context.openFileOutput(name,MODE_APPEND); 
      PrintStream prt; 
      prt = new PrintStream(output); 
      prt.println(something); 
      prt.close(); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

然後你會需要像這樣構建它:textWriter tw = new textWriter(this);

1

而不是創建一個新的活動,請將寫入方法放在您正在調用它的原始活動中。

問題出現在textWriter調用openOutputStream()但尚未創建時。所以是的,我會說這是一個上下文的問題,因爲上下文調用openOutputStream()尚未創建。