Java OpenFileOutput()获取nullPointerException
我创建了一个静态处理程序,用于从侦听传入蓝牙数据的线程接收数据。 此处理程序调用:measure_finish2(),此方法调用名为:measure_finish()的非静态metod,在最后一个处理程序中,我需要调用openFileOutput方法,但我有一个nullPointerException,即使在调用简单Toast时,我也有相同的nullPointerException,这是我代码的一部分:Java OpenFileOutput()获取nullPointerException,java,android,nullpointerexception,bluetooth,android-handler,Java,Android,Nullpointerexception,Bluetooth,Android Handler,我创建了一个静态处理程序,用于从侦听传入蓝牙数据的线程接收数据。 此处理程序调用:measure_finish2(),此方法调用名为:measure_finish()的非静态metod,在最后一个处理程序中,我需要调用openFileOutput方法,但我有一个nullPointerException,即使在调用简单Toast时,我也有相同的nullPointerException,这是我代码的一部分: public class MainActivity Extends Activity
public class MainActivity Extends Activity{
...
public void sending_tubes_to_clean(){
stream_cleaning_tubes = "15";
for(int i = 0;i<4;i++){
if(itemsChecked[i] == true){
stream_cleaning_tubes += "," + Integer.toString(i+1);
}
}
if(conectToServerThread != null){
conectToServerThread.commsThread.write(stream_cleaning_tubes);
Toast.makeText(getBaseContext(), "Cleaning the selected Tubes!", Toast.LENGTH_SHORT).show();
cleaning_status();
}else{
Toast.makeText(getBaseContext(), "You must be connected to the Viscometer!...", Toast.LENGTH_SHORT).show();
}
Log.d(tag,stream_cleaning_tubes);
}
public static Handler MainReceiver = new Handler(){
@Override
public void handleMessage(Message msg){
int numOfBytesReceived = msg.arg1;
byte[] buffer = (byte[]) msg.obj;
String strReceived = new String(buffer);
String comand;
strReceived = strReceived.substring(3,numOfBytesReceived);
comand = strReceived.substring(0,2);
if(comand.toString().equals("03")){
//MainActivity o = new MainActivity();
measure_finish2(strReceived.substring(3));
//measure_finish2(strReceived.substring(3));
}
}
};
public static String get_data(String aux){
String aux2 = null;
aux2 = aux.substring(0,aux.indexOf(","));
return aux2;
}
public static void measure_finish2(String data){
MainActivity o = new MainActivity();
o.measure_finish(data);
}
public void measure_finish(String data){
String data_to_save,strdate,tube,temp,time,cte_tube,visco;
String file_name = "results.txt";
Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy HH:mm");
strdate = sdf.format(c.getTime());
tube = get_data(data);
data = data.substring(data.indexOf(",")+1);
temp = get_data(data);
data = data.substring(data.indexOf(",")+1);
time = get_data(data);
data = data.substring(data.indexOf(",")+1);
cte_tube = get_data(data);
data = data.substring(data.indexOf(",")+1);
visco = get_data(data);
data_to_save = sample_id_var + user_id_var + strdate + "Tube# " + tube + temp + "°C"+ cte_tube + time + "s" + visco + "cSt" + "\n";
try{
FileOutputStream fos = openFileOutput(file_name,MODE_WORLD_READABLE);
OutputStreamWriter osw = new OutputStreamWriter(fos);
try {
osw.write(data_to_save);
osw.flush();
osw.close();
}catch (IOException e) {
e.printStackTrace();
}
//Toast.makeText(getBaseContext(), "F saved", Toast.LENGTH_SHORT).show();
}catch(FileNotFoundException e)
{
e.printStackTrace();
}
samp_id_view.setText(data_to_save);
cleaning_status();
}
首先,永远不要自己创建活动的实例。Android的框架创造了这些,而不是你。此o
未正确初始化,因此任何使用它的尝试,例如openFileOutput()
、一个Toast
等,通常都会崩溃
其次,不要在主应用程序线程上执行磁盘I/O。measure_finish()
中显示的代码应该由蓝牙线程或其他后台线程执行,而不是由主应用程序线程执行。正如您在日志猫中看到的,您的NullPointerException是由MainActivity引起的。将\u发送到\u clean(MainActivity.java:320)。但是你没有在你展示祝酒词的地方发布代码。是的,但是在这个方法里面只有祝酒词:我已经更新了我的帖子,看看它们,如果有人现在知道如何解决这个问题,请告诉我……你仍然有被禁止的“新MainActivity”。我们看不到Toast调用的函数。请调整您的代码。这当然是错误的原因。但真正的错误很可能是让这个类扩展活动——它似乎与活动所做的任何事情都没有多大关系。可能应该做的是将有效的上下文或对活动的其他引用传递给它,然后可以使用它来执行诸如显示toast或获取包路径之类的操作。然后使用new
创建实例是合法的。向构造函数添加一个上下文参数,从触发活动中传递“this”。最好是简单地pas从GetFileDir()获得的目录,但随后必须跳转一个额外步骤,创建一个文件,将其作为父级,并将指定的文件名作为第二个参数,调用其setReadable(true,false)来设置世界可读权限,然后从它创建一个FileOutputStream.Commonware是正确的,我将我的i/O任务移动到后台线程,并将上下文作为参数传递,现在我的代码工作正常。
04-17 17:09:18.926: E/AndroidRuntime(1685): FATAL EXCEPTION: main
04-17 17:09:18.926: E/AndroidRuntime(1685): Process: com.callirgos.viscopi, PID: 1685
04-17 17:09:18.926: E/AndroidRuntime(1685): java.lang.IllegalStateException: Could not execute method of the activity
04-17 17:09:18.926: E/AndroidRuntime(1685): at android.view.View$1.onClick(View.java:4007)
04-17 17:09:18.926: E/AndroidRuntime(1685): at android.view.View.performClick(View.java:4756)
04-17 17:09:18.926: E/AndroidRuntime(1685): at android.view.View$PerformClick.run(View.java:19749)
04-17 17:09:18.926: E/AndroidRuntime(1685): at android.os.Handler.handleCallback(Handler.java:739)
04-17 17:09:18.926: E/AndroidRuntime(1685): at android.os.Handler.dispatchMessage(Handler.java:95)
04-17 17:09:18.926: E/AndroidRuntime(1685): at android.os.Looper.loop(Looper.java:135)
04-17 17:09:18.926: E/AndroidRuntime(1685): at android.app.ActivityThread.main(ActivityThread.java:5221)
04-17 17:09:18.926: E/AndroidRuntime(1685): at java.lang.reflect.Method.invoke(Native Method)
04-17 17:09:18.926: E/AndroidRuntime(1685): at java.lang.reflect.Method.invoke(Method.java:372)
04-17 17:09:18.926: E/AndroidRuntime(1685): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
04-17 17:09:18.926: E/AndroidRuntime(1685): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
04-17 17:09:18.926: E/AndroidRuntime(1685): Caused by: java.lang.reflect.InvocationTargetException
04-17 17:09:18.926: E/AndroidRuntime(1685): at java.lang.reflect.Method.invoke(Native Method)
04-17 17:09:18.926: E/AndroidRuntime(1685): at java.lang.reflect.Method.invoke(Method.java:372)
04-17 17:09:18.926: E/AndroidRuntime(1685): at android.view.View$1.onClick(View.java:4002)
04-17 17:09:18.926: E/AndroidRuntime(1685): ... 10 more
04-17 17:09:18.926: E/AndroidRuntime(1685): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.FileOutputStream android.content.Context.openFileOutput(java.lang.String, int)' on a null object reference
04-17 17:09:18.926: E/AndroidRuntime(1685): at android.content.ContextWrapper.openFileOutput(ContextWrapper.java:181)
04-17 17:09:18.926: E/AndroidRuntime(1685): at com.callirgos.viscopi.MainActivity.measure_finish(MainActivity.java:434)
04-17 17:09:18.926: E/AndroidRuntime(1685): at com.callirgos.viscopi.MainActivity.measure_finish2(MainActivity.java:415)
04-17 17:09:18.926: E/AndroidRuntime(1685): at com.callirgos.viscopi.MainActivity.test_files(MainActivity.java:478)
04-17 17:09:18.926: E/AndroidRuntime(1685): ... 13 more
MainActivity o = new MainActivity();