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

java-openFileInput(FILENAME)nullPointerException:FILENAME不为null,第1张

概述我有一个扩展应用程序的类,称为MyApplicaton,用于存储全局变量,即我希望能够在整个android应用程序中的任何位置访问的变量.在活动中,我可以通过调用来访问MyApplicationmyapp=(MyApplication)this.getApplication();我想将其中一些变量存储到文件中,并能够从文件中读取它

我有一个扩展应用程序的类,称为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 questionprivate 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 constructor03-26 13:08:05.462: V/Here(26212): In MyApplication readFromStorage03-26 13:08:05.462: V/Here(26212): filename: globs03-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: main03-26 13:08:05.462: E/AndroIDRuntime(26212): java.lang.RuntimeException: Unable to instantiate application com.example.tetherly.MyApplication: java.lang.NullPointerException03-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.access00(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.NullPointerException03-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
@H_502_42@解决方法:

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

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

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

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

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

总结

以上是内存溢出为你收集整理的java-openFileInput(FILENAME)nullPointerException:FILENAME不为null全部内容,希望文章能够帮你解决java-openFileInput(FILENAME)nullPointerException:FILENAME不为null所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1076987.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存