为什么这个FileOutputStream会给出NullPointerException?

时间:2013-03-04 04:17:11

标签: java android fileoutputstream

所以当我尝试编写文件时,我正在运行一个创建NullPointerException的应用程序。

当用户按下新的设置按钮时,我的第一个活动(见下文)调用NewSet活动。当我尝试在NewSet活动中编写输入时,它会抛出NullPointerException。打印出fileOut会显示我的值为null,不应该为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)

1 个答案:

答案 0 :(得分:0)

android.content.ContextWrapper课程中会抛出异常。方法是:

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

在这里,我看到哪种可能导致NullPointerException的唯一可能性是mBase类型的数据成员Context为NULL。

您可以检查Context数据成员是否为非空。