Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 写入文件时出现Android NullPointerException_Java_Android_Json_File Io - Fatal编程技术网

Java 写入文件时出现Android NullPointerException

Java 写入文件时出现Android NullPointerException,java,android,json,file-io,Java,Android,Json,File Io,在尝试写入内部存储器中的文件时,我遇到了一个NullPointerException,我不知道为什么。我阅读了所有的文档,并使用这些代码进行测试,但没有成功 我用一个httpget请求(这是一行,但是是JSON格式)拉一个字符串,并试图将该字符串写入内存中的JSON文件中 我知道HTTP GET请求工作正常,因为我能够将其记录到LogCat中,但我仍停留在希望将其写入JSON文件的部分 主要活动 @Override protected void onCreate(Bundle saved

在尝试写入内部存储器中的文件时,我遇到了一个
NullPointerException
,我不知道为什么。我阅读了所有的文档,并使用这些代码进行测试,但没有成功

我用一个
httpget请求
(这是一行,但是是JSON格式)拉一个字符串,并试图将该字符串写入内存中的
JSON
文件中

我知道HTTP GET请求工作正常,因为我能够将其记录到LogCat中,但我仍停留在希望将其写入JSON文件的部分

主要活动

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_new_checklist);
    mGestureDetector = createGestureDetector(this);

//      JSONReader jsonReader = new JSONReader(this.getApplicationContext());
//      jsonReader.readJson();
//      jsonReader.getData();

    new BackgroundTask().execute("");

    try {
        writeToJSON();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

public void writeToJSON() throws IOException {
    String filename = "test.json";
    FileOutputStream fos = openFileOutput(filename, Context.MODE_PRIVATE);
    fos.write(data.getBytes());
    fos.close();
}

public class BackgroundTask extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... params) {
        HTTPRequest request = new HTTPRequest(1, 2);

        try {
            data = request.GetRequest();
            Log.v("testing", data);
//              request.writeToJSON();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

}
    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_new_checklist);
    mGestureDetector = createGestureDetector(this);


    new BackgroundTask();

}

public void writeToJSON() throws IOException {
    String filename = "test.json";
    FileOutputStream fos = openFileOutput(filename, Context.MODE_PRIVATE);
    fos.write(data.getBytes());
    fos.close();
}

public class BackgroundTask extends AsyncTask<Void, Void, Void> {

    protected Void doInBackground(Void... params) {
        HTTPRequest request = new HTTPRequest(1, 2);

        try {
            data = request.GetRequest();
            Log.v("testing", data);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    protected void onPostExecute() {
        try {
            writeToJSON();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
堆栈跟踪

12-24 16:32:12.159: E/AndroidRuntime(4301): FATAL EXCEPTION: main
12-24 16:32:12.159: E/AndroidRuntime(4301): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.medusa.checkit/com.medusa.checkit.NewChecklistActivity}: java.lang.NullPointerException
12-24 16:32:12.159: E/AndroidRuntime(4301):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
12-24 16:32:12.159: E/AndroidRuntime(4301):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
12-24 16:32:12.159: E/AndroidRuntime(4301):     at android.app.ActivityThread.access$600(ActivityThread.java:123)
12-24 16:32:12.159: E/AndroidRuntime(4301):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
12-24 16:32:12.159: E/AndroidRuntime(4301):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-24 16:32:12.159: E/AndroidRuntime(4301):     at android.os.Looper.loop(Looper.java:137)
12-24 16:32:12.159: E/AndroidRuntime(4301):     at android.app.ActivityThread.main(ActivityThread.java:4424)
12-24 16:32:12.159: E/AndroidRuntime(4301):     at java.lang.reflect.Method.invokeNative(Native Method)
12-24 16:32:12.159: E/AndroidRuntime(4301):     at java.lang.reflect.Method.invoke(Method.java:511)
12-24 16:32:12.159: E/AndroidRuntime(4301):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
12-24 16:32:12.159: E/AndroidRuntime(4301):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
12-24 16:32:12.159: E/AndroidRuntime(4301):     at dalvik.system.NativeStart.main(Native Method)
12-24 16:32:12.159: E/AndroidRuntime(4301): Caused by: java.lang.NullPointerException
12-24 16:32:12.159: E/AndroidRuntime(4301):     at com.medusa.checkit.NewChecklistActivity.writeToJSON(NewChecklistActivity.java:52)
12-24 16:32:12.159: E/AndroidRuntime(4301):     at com.medusa.checkit.NewChecklistActivity.onCreate(NewChecklistActivity.java:42)
12-24 16:32:12.159: E/AndroidRuntime(4301):     at android.app.Activity.performCreate(Activity.java:4470)
12-24 16:32:12.159: E/AndroidRuntime(4301):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
12-24 16:32:12.159: E/AndroidRuntime(4301):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
12-24 16:32:12.159: E/AndroidRuntime(4301):     ... 11 more
新编辑的代码-主要活动

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_new_checklist);
    mGestureDetector = createGestureDetector(this);

//      JSONReader jsonReader = new JSONReader(this.getApplicationContext());
//      jsonReader.readJson();
//      jsonReader.getData();

    new BackgroundTask().execute("");

    try {
        writeToJSON();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

public void writeToJSON() throws IOException {
    String filename = "test.json";
    FileOutputStream fos = openFileOutput(filename, Context.MODE_PRIVATE);
    fos.write(data.getBytes());
    fos.close();
}

public class BackgroundTask extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... params) {
        HTTPRequest request = new HTTPRequest(1, 2);

        try {
            data = request.GetRequest();
            Log.v("testing", data);
//              request.writeToJSON();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

}
    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_new_checklist);
    mGestureDetector = createGestureDetector(this);


    new BackgroundTask();

}

public void writeToJSON() throws IOException {
    String filename = "test.json";
    FileOutputStream fos = openFileOutput(filename, Context.MODE_PRIVATE);
    fos.write(data.getBytes());
    fos.close();
}

public class BackgroundTask extends AsyncTask<Void, Void, Void> {

    protected Void doInBackground(Void... params) {
        HTTPRequest request = new HTTPRequest(1, 2);

        try {
            data = request.GetRequest();
            Log.v("testing", data);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    protected void onPostExecute() {
        try {
            writeToJSON();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

由于
AsyncTask
是异步的,
data
null
,因为
AsyncTask
在调用该方法之前尚未完成。从
AsyncTask
onPostExecute()
调用
writeToJSON()
,因此在
data
有值之前不会调用它

另外,
doInBackground()
返回
null
,但根据任务声明

public class BackgroundTask extends AsyncTask<String, Void, String> {
公共类BackgroundTask扩展了AsyncTask{

onPostExecute()
应该是一个
字符串
。最后一个
参数
应该是
Void
,或者您应该从
doInBackground()
返回一个
字符串

请发布崩溃的堆栈跟踪。我们无法(轻松)找到它如果我们看不到错误,也可以。对不起,实际上是在编辑和添加stacktrace,正如您所评论的。我不明白为什么它要求一个空构造函数?好像您正在实例化一个活动。不要这样做。哦,stacktrace错了,只是重新编辑并发布了正确的stacktrace。我可以更改
doInBackground()
Void
?由于我实际上不需要为此返回字符串,我只是使用了
AsyncTask
的模板。是否可以将所有
Void
s与AsyncTask一起使用,或者它是否需要返回一些内容?所有
Void
都可以。只要更改声明,使它们都具有
Void
,如果没有方法需要任何东西。这样做,然后按照我在回答中所说的,将方法调用放入
onPostExecute()
,你应该会很好!我认为这很有效!没有出现任何错误。现在,看看如何打开文件,看看它是否正确写入。谢谢@codeMagicHmm…我的
受保护的Void doInBackground(Void…params)
code look correct原因当我尝试运行
new BackgroundTask().doInBackground()
时,它会给我一个
NetworkOnMainThreadException
,这显然意味着它不是在后台运行的?!看起来正确,但是当你调用它时,你应该有
new BackgroundTask().execute();
而不仅仅是
新的背景任务();