java-openFileInput(FILENAME)nullPointerException:FILENAME不为null

我有一个扩展应用程序的类,称为MyApplicaton,用于存储全局变量,即我希望能够在整个android应用程序中的任何位置访问的变量.

 

在活动中,我可以通过调用来访问MyApplication

 

myapp = (MyApplication) this.getApplication();

我想将其中一些变量存储到文件中,并能够从文件中读取它们.
现在,如果我从MyApplication构造函数中调用readFromStorage(),则会收到NullPointerException(下面记录).但是,如果我不从构造函数中调用readFromStorage(),而是稍后再说,例如,在调用writeToStorage之后(不是从构造函数中),它可以很好地执行.

如果文件不存在,我希望看到FileNotFoundException.但这不会被抛出.

这是MyApplication,它扩展了Application.滚动到底部以查看我的writeToStorage和readFromStorage()方法.

 

public class MyApplication extends Application {    
private static String FILENAME = "globs";
private static int CONTEXT = Context.MODE_PRIVATE;
private String value1 = new String();
private String value2 = new String();

public MyApplication(){
    //check for and load stored globals in internal storage
    Log.v("Here", "In MyApplication constructor");
    readFromStorage();
}

//Took out unnecessary getter and setters for this question

private void writeToStorage(){
    //Create JSON object
    Log.v("Here", "In MyApplication writeToStorage");
    JSONObject obj = new JSONObject();
    File f = new File(FILENAME);
    OutputStream out;
    try {
        obj.put("value1", value1);
        obj.put("value2", value2);
        FileOutputStream fos = openFileOutput(FILENAME, CONTEXT);
        fos.write(obj.toString().getBytes());
        fos.close();
    } catch (JSONException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }  
    //We've just written to the file. Lets see if we can read from it...
    this.readFromStorage();
}

public void readFromStorage(){
    Log.v("Here", "In MyApplication readFromStorage");
    try {
        Log.v("Here", "FILENAME: "+ FILENAME);
        FileInputStream out = openFileInput(FILENAME);
        BufferedReader inputReader = new BufferedReader(new InputStreamReader(out));
        String inputString;
        StringBuffer sb = new StringBuffer();                
        while ((inputString = inputReader.readLine()) != null) {
            sb.append(inputString + "\n");
        }
        JSONObject jsonObject = new JSONObject(sb.toString());     
        this.value1 = (String) jsonObject.get("value1");
        this.value2 = (String) jsonObject.get("value2");
        out.close();
        inputReader.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}

导致nullpointer异常的行是:

 

FileInputStream out = openFileInput(FILENAME);

FILENAME不为null,在调用它之前我先通过Log语句进行检查.

这是日志输出:

 

03-26 13:08:05.462: V/Here(26212): In MyApplication constructor
03-26 13:08:05.462: V/Here(26212): In MyApplication readFromStorage
03-26 13:08:05.462: V/Here(26212): FILENAME: globs
03-26 13:08:05.462: W/dalvikvm(26212): threadid=1: thread exiting with uncaught exception (group=0x41fb62d0)
03-26 13:08:05.462: E/AndroidRuntime(26212): FATAL EXCEPTION: main
03-26 13:08:05.462: E/AndroidRuntime(26212): java.lang.RuntimeException: Unable to instantiate application com.example.tetherly.MyApplication: java.lang.NullPointerException
03-26 13:08:05.462: E/AndroidRuntime(26212):    at android.app.LoadedApk.makeApplication(LoadedApk.java:553)
03-26 13:08:05.462: E/AndroidRuntime(26212):    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4795)
03-26 13:08:05.462: E/AndroidRuntime(26212):    at android.app.ActivityThread.access$1300(ActivityThread.java:151)
03-26 13:08:05.462: E/AndroidRuntime(26212):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
03-26 13:08:05.462: E/AndroidRuntime(26212):    at android.os.Handler.dispatchMessage(Handler.java:99)
03-26 13:08:05.462: E/AndroidRuntime(26212):    at android.os.Looper.loop(Looper.java:155)
03-26 13:08:05.462: E/AndroidRuntime(26212):    at android.app.ActivityThread.main(ActivityThread.java:5485)
03-26 13:08:05.462: E/AndroidRuntime(26212):    at java.lang.reflect.Method.invokeNative(Native Method)
03-26 13:08:05.462: E/AndroidRuntime(26212):    at java.lang.reflect.Method.invoke(Method.java:511)
03-26 13:08:05.462: E/AndroidRuntime(26212):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028)
03-26 13:08:05.462: E/AndroidRuntime(26212):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:795)
03-26 13:08:05.462: E/AndroidRuntime(26212):    at dalvik.system.NativeStart.main(Native Method)
03-26 13:08:05.462: E/AndroidRuntime(26212): Caused by: java.lang.NullPointerException
03-26 13:08:05.462: E/AndroidRuntime(26212):    at android.content.ContextWrapper.openFileInput(ContextWrapper.java:159)
03-26 13:08:05.462: E/AndroidRuntime(26212):    at com.example.tetherly.MyApplication.readFromStorage(MyApplication.java:106)
03-26 13:08:05.462: E/AndroidRuntime(26212):    at com.example.package.MyApplication.<init>(MyApplication.java:32)
03-26 13:08:05.462: E/AndroidRuntime(26212):    at java.lang.Class.newInstanceImpl(Native Method)
03-26 13:08:05.462: E/AndroidRuntime(26212):    at java.lang.Class.newInstance(Class.java:1319)
03-26 13:08:05.462: E/AndroidRuntime(26212):    at android.app.Instrumentation.newApplication(Instrumentation.java:988)
03-26 13:08:05.462: E/AndroidRuntime(26212):    at android.app.Instrumentation.newApplication(Instrumentation.java:973)
03-26 13:08:05.462: E/AndroidRuntime(26212):    at android.app.LoadedApk.makeApplication(LoadedApk.java:544)
03-26 13:08:05.462: E/AndroidRuntime(26212):    ... 11 more

最佳答案

您在构造函数中使用应用程序作为上下文还为时过早.在应用程序生命周期中,未在onCreate()之前为上下文使用设置它.

 

基本上,初始化具有与该问题相关的三个步骤:

>实例化对象.
>在对象中设置资源和上下文.
>在对象上调用onCreate().

在步骤1的实例化(构造函数,成员变量)上,对象尚未可用作上下文.

活动和服务也是如此:您只能在onCreate()或更高版本中将它们用作上下文.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值