-3

理由もなく、このNullPointerExceptionが発生します。Bluetoothで電話に接続されているMCUに加速度計の「x」値を送信しようとしています。バイトの送信を開始するまでは、すべて問題ないようです。

MainActivity.class:

    private void getAccelerometer(SensorEvent event) {

        float[] values = event.values;
        // Movement
        float x = values[0];
        float y = values[1];
        float z = values[2]; 

        // Convert float value to integer for progress bars because 
        // they dont't support float value
        int mProgressStatus_x = (int)x;
        int mProgressStatus_y = (int)y;
        int mProgressStatus_z = (int)z;

        // Set converted x, y and z values to progress bars
        // Add to each progress bar value 10 because progress bar dosen't support negative value
        mProgressBar_x.setProgress(mProgressStatus_x + 10); 
        mProgressBar_y.setProgress(mProgressStatus_y + 10);
        mProgressBar_z.setProgress(mProgressStatus_z + 10);
        mX = Float.toString(x);
        SendBytes(mX); 
}
    private void SendBytes (String mX) {

        if (mConnectionStatus == 1 && mX != null) {

            // mX is the accelerometer value which is converted to the String
            byte[] out = mX.getBytes();
            // mBluetoothService is BluetoothService.java   
            mBluetoothService.write(out); // Line 150
                }

    }

BluetoothService.class:

     public synchronized void connected(BluetoothSocket socket, BluetoothDevice device) {

         // Cancel the thread that completed the connection
         if (mConnectThread != null) {mConnectThread.cancel(); mConnectThread = null; }
         // Cancel the ConnectedThread to make sure that it's not running currently connection
         if (mConnectedThread != null) {mConnectedThread.cancel(); mConnectedThread = null;}
         // Start the ConnectedThread to manage connection and perform transmission 
         mConnectedThread = new ConnectedThread(socket);
         mConnectedThread.start();
         // Send the name of the connected device back to the UI Activity
         Message msg = mHandler.obtainMessage(MainActivity.MESSAGE_DEVICE_NAME);
         Bundle bundle = new Bundle();
         bundle.putString(MainActivity.DEVICE_NAME, device.getName());
         msg.setData(bundle);
         mHandler.sendMessage(msg);
         // Set state of connection to STATE_CONNECTED
         setState(STATE_CONNECTED);
         mmConnectionStatus = 1;
         System.out.println("State connected");
     }

public void write(byte[] out) {
     ConnectedThread r;
     // Synchronize a copy of the ConnectedThread
     synchronized (this) {

         r = mConnectedThread;
     }
     if(out != null){   
     r.write(out); } // Line 133
    }

private class ConnectedThread extends Thread {
        private final BluetoothSocket mmSocket;
        private final InputStream mmInStream;
        private final OutputStream mmOutStream;

    // Thread for managing connection 
    public ConnectedThread(BluetoothSocket socket) {
        System.out.println("ConnectedThread started");
        mmSocket = socket;  
        InputStream tmpIn = null;
        OutputStream tmpOut = null;

        try { // Get the input and output streams, using temp objects because
              // member streams are final
              tmpIn = socket.getInputStream();
              tmpOut = socket.getOutputStream(); 
              System.out.println("creating socket");
              }
        catch (IOException e) {
            System.out.println("tmp socket not created");
        }
    mmInStream = tmpIn;
    mmOutStream = tmpOut;
    }


    public void run() {
        System.out.println("ConnectedThread status" + mConnectedThread);


        // Buffer store for the stream
        byte[] buffer = new byte[1024];
        // Bytes returned from the read()
        int bytesIn;
        // Keep listening until an  occurs
        while(true) {
            try {
                bytesIn = mmInStream.read(buffer);
            } catch (IOException e) {
                break;
            }

        }
    }
    // Call this from the MainActivity to send data to the remote device
    public void write(byte[] bytes) {
        System.out.println(bytes);
            if(mState == STATE_CONNECTED && bytes != null){
            try {
                mmOutStream.write(bytes);
                mmOutStream.flush();
            } catch (IOException e) {
                System.out.println("Exception during write" + e);
            }
            }
}
    // Call this from the MainActivity to shutdown the connection
    public void cancel() {

        try {
            mmSocket.close();

        } catch (IOException e) {}

    }
}

ログ:

12-12 03:22:59.228: D/libEGL(12554): loaded /vendor/lib/egl/libEGL_POWERVR_SGX540_120.so
12-12 03:22:59.228: D/libEGL(12554): loaded /vendor/lib/egl/libGLESv1_CM_POWERVR_SGX540_120.so
12-12 03:22:59.228: D/libEGL(12554): loaded /vendor/lib/egl/libGLESv2_POWERVR_SGX540_120.so
12-12 03:22:59.368: D/OpenGLRenderer(12554): Enabling debug mode 0
12-12 03:23:01.767: D/dalvikvm(12554): GC_CONCURRENT freed 111K, 2% free 9181K/9324K, paused 4ms+7ms, total 33ms
12-12 03:23:01.892: D/BluetoothAdapter(12554): enable(): BT is already enabled..!
12-12 03:23:08.509: I/System.out(12554): ConnectThread statusThread[Thread-919,5,main]
12-12 03:23:08.509: W/BluetoothAdapter(12554): getBluetoothService() called with no BluetoothManagerCallback
12-12 03:23:08.517: D/BluetoothSocket(12554): connect(), SocketState: INIT, mPfd: {ParcelFileDescriptor: FileDescriptor[46]}
12-12 03:23:09.017: E/ActivityThread(12554): Activity com.example.bluetoothc.settings has leaked IntentReceiver com.example.bluetoothc.settings$2@4151ecb8 that was originally registered here. Are you missing a call to unregisterReceiver()?
12-12 03:23:09.017: E/ActivityThread(12554): android.app.IntentReceiverLeaked: Activity com.example.bluetoothc.settings has leaked IntentReceiver com.example.bluetoothc.settings$2@4151ecb8 that was originally registered here. Are you missing a call to unregisterReceiver()?
12-12 03:23:09.017: E/ActivityThread(12554):    at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:795)
12-12 03:23:09.017: E/ActivityThread(12554):    at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:596)
12-12 03:23:09.017: E/ActivityThread(12554):    at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1316)
12-12 03:23:09.017: E/ActivityThread(12554):    at android.app.ContextImpl.registerReceiver(ContextImpl.java:1296)
12-12 03:23:09.017: E/ActivityThread(12554):    at android.app.ContextImpl.registerReceiver(ContextImpl.java:1290)
12-12 03:23:09.017: E/ActivityThread(12554):    at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:423)
12-12 03:23:09.017: E/ActivityThread(12554):    at com.example.bluetoothc.settings.onCreate(settings.java:106)
12-12 03:23:09.017: E/ActivityThread(12554):    at android.app.Activity.performCreate(Activity.java:5104)
12-12 03:23:09.017: E/ActivityThread(12554):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
12-12 03:23:09.017: E/ActivityThread(12554):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
12-12 03:23:09.017: E/ActivityThread(12554):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
12-12 03:23:09.017: E/ActivityThread(12554):    at android.app.ActivityThread.access$600(ActivityThread.java:141)
12-12 03:23:09.017: E/ActivityThread(12554):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
12-12 03:23:09.017: E/ActivityThread(12554):    at android.os.Handler.dispatchMessage(Handler.java:99)
12-12 03:23:09.017: E/ActivityThread(12554):    at android.os.Looper.loop(Looper.java:137)
12-12 03:23:09.017: E/ActivityThread(12554):    at android.app.ActivityThread.main(ActivityThread.java:5039)
12-12 03:23:09.017: E/ActivityThread(12554):    at java.lang.reflect.Method.invokeNative(Native Method)
12-12 03:23:09.017: E/ActivityThread(12554):    at java.lang.reflect.Method.invoke(Method.java:511)
12-12 03:23:09.017: E/ActivityThread(12554):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
12-12 03:23:09.017: E/ActivityThread(12554):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
12-12 03:23:09.017: E/ActivityThread(12554):    at dalvik.system.NativeStart.main(Native Method)
12-12 03:23:09.814: I/System.out(12554): making connection to remote device
12-12 03:23:09.814: I/System.out(12554): ConnectedThread started
12-12 03:23:09.814: I/System.out(12554): creating socket
12-12 03:23:09.822: I/System.out(12554): ConnectedThread statusThread[Thread-920,5,main]
12-12 03:23:09.822: I/System.out(12554): State connected
12-12 03:23:09.837: I/System.out(12554): 1
12-12 03:23:09.876: D/AndroidRuntime(12554): Shutting down VM
12-12 03:23:09.876: W/dalvikvm(12554): threadid=1: thread exiting with uncaught exception (group=0x40c25930)
12-12 03:23:09.876: E/AndroidRuntime(12554): FATAL EXCEPTION: main
12-12 03:23:09.876: E/AndroidRuntime(12554): java.lang.NullPointerException
12-12 03:23:09.876: E/AndroidRuntime(12554):    at com.example.bluetoothc.BluetoothService.write(BluetoothService.java:133)
12-12 03:23:09.876: E/AndroidRuntime(12554):    at com.example.bluetoothc.MainActivity.SendBytes(MainActivity.java:150)
12-12 03:23:09.876: E/AndroidRuntime(12554):    at com.example.bluetoothc.MainActivity.getAccelerometer(MainActivity.java:140)
12-12 03:23:09.876: E/AndroidRuntime(12554):    at com.example.bluetoothc.MainActivity.onSensorChanged(MainActivity.java:111)
12-12 03:23:09.876: E/AndroidRuntime(12554):    at android.hardware.SystemSensorManager$ListenerDelegate$1.handleMessage(SystemSensorManager.java:204)
12-12 03:23:09.876: E/AndroidRuntime(12554):    at android.os.Handler.dispatchMessage(Handler.java:99)
12-12 03:23:09.876: E/AndroidRuntime(12554):    at android.os.Looper.loop(Looper.java:137)
12-12 03:23:09.876: E/AndroidRuntime(12554):    at android.app.ActivityThread.main(ActivityThread.java:5039)
12-12 03:23:09.876: E/AndroidRuntime(12554):    at java.lang.reflect.Method.invokeNative(Native Method)
12-12 03:23:09.876: E/AndroidRuntime(12554):    at java.lang.reflect.Method.invoke(Method.java:511)
12-12 03:23:09.876: E/AndroidRuntime(12554):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
12-12 03:23:09.876: E/AndroidRuntime(12554):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
12-12 03:23:09.876: E/AndroidRuntime(12554):    at dalvik.system.NativeStart.main(Native Method)
12-12 03:23:13.884: I/Process(12554): Sending signal. PID: 12554 SIG: 9
4

3 に答える 3

2

非常に明確な理由があります。

Activity com.example.bluetoothc.settings has leaked IntentReceiver com.example.bluetoothc.settings$2@4151ecb8 that was originally registered here. Are you missing a call to unregisterReceiver()?

IntentReceiverをリークしています。イベントがReceiverにルーティングされると(登録を解除しなかったため)、アクティビティが一時停止/破棄された後、すべてのコンテキスト参照が失われたか、無効になったため、どこかでNullPointerExceptionがスローされます。

于 2012-12-12T01:51:56.693 に答える
0

rnullであるか、初期化されていない可能性があります

于 2012-12-12T02:07:14.570 に答える
0

オブジェクト「r」のインスタンスはnullですか?mConnectedThreadがnullかどうかを確認します。null参照の関数を呼び出すと->NullPointerExceptionが発生します。

于 2012-12-12T01:49:05.073 に答える