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();
而不仅仅是新的背景任务();