【问题标题】:OpenFileOutput() gets an nullPointerExceptionOpenFileOutput() 得到一个 nullPointerException
【发布时间】:2015-06-24 22:13:25
【问题描述】:

我创建了一个静态处理程序来从一个监听传入蓝牙数据的线程接收数据。 这个处理程序调用:measure_finish2(),这个方法调用一个非静态方法:measure_finish(),在最后一个里面我需要调用 openFileOutput 方法但是我有一个 nullPointerException,即使我调用一个简单的 Toast 我也有同样的nullPointrException,这是我的代码的一部分:

    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();
        }

请任何人帮助我,这是我遇到的错误:

 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

【问题讨论】:

  • 正如您在 logcat 中看到的,您的 NullPointerException 是由 MainActivity.sending_tubes_to_clean(MainActivity.java:320) 引起的。但是您没有在显示 Toast 的位置发布代码。
  • 是的,但是在那个方法里面只有一个 Toast:
  • 我已经更新了我的帖子,看看他们,如果有人现在如何解决这个问题,请告诉我...
  • 您仍然拥有被禁止的“新 MainActivity”。而且我们看不到调用该 Toast 的函数。请调整您的代码。

标签: java android nullpointerexception bluetooth android-handler


【解决方案1】:
MainActivity o = new MainActivity();

首先,从不自己创建一个Activity 的实例。 Android 的框架创建了这些,而不是您。此o 未正确初始化,因此任何尝试使用它(例如openFileOutput()Toast 等)通常都会崩溃。

其次,不要在主应用程序线程上进行磁盘 I/O。 measure_finish() 中显示的代码应该由蓝牙线程或另一个后台线程完成,而不是主应用程序线程。

【讨论】:

  • 这当然是错误的原因。但可能真正的错误在于让这个类扩展了 Activity - 它似乎与 Activity 所做的任何事情都没有太大关系。可能应该做的是将一个有效的上下文或其他对 Activity 的引用传递给它,然后可以用来做一些事情,比如显示一个 toast 或获取包路径。那么用new创建实例就合法了。
  • 向构造函数添加一个 Context 参数,您可以在其中从触发 Activity 传递“this”。最好简单地传递从 getFilesDir() 获得的目录,但是您必须跳过一个额外的步骤,即创建一个文件,将其作为父级,将您指定的文件名作为第二个参数,调用它的 setReadable( true, false) 设置全局可读权限,然后从中创建 FileOutputStream。
  • CommonsWare 是对的,我将 I/O 任务移动到后台线程,并将上下文作为参数传递,现在我的代码可以正常工作了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-06
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多