2012-12-12 3 views
-3

Je reçois cette exception NullPointerException sans raison. J'essaye d'envoyer la valeur 'x' de l'accéléromètre au MCU qui est connecté à mon téléphone par bluetooth. Tout semble aller bien jusqu'à ce qu'il commence à envoyer des octets.Exception de pointeur nul

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) {} 

    } 
} 

Log:

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 [email protected] 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 [email protected] 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 
+0

est mmOutStream! = Null quand utilisé? – blindstuff

+0

'java.lang.NullPointerException à BluetoothService.java: 133', cela me semble assez éloquent. – ignis

+6

Titre hilarant! – jahroy

Répondre

2

Il y a une raison très claire.

Activity com.example.bluetoothc.settings has leaked IntentReceiver [email protected] that was originally registered here. Are you missing a call to unregisterReceiver()? 

Vous avez une fuite d'un IntentReceiver. Lorsqu'un événement est routé vers le récepteur (parce que vous ne l'avez pas désinscrit) le plus probable après que l'activité soit en pause/détruite, il lève une exception NullPointerException parce qu'il a perdu toutes les références de contexte, ou elles ne sont plus valides.

0

instance de l'objet "r" est nul? Vérifiez si mConnectedThread est null. Si vous appelez la fonction de référence nulle -> vous avez NullPointerException.

+0

mCOnnectedThread n'est pas nul, voici l'ensemble du projet: http://www.mediafire.com/?81jq4nh8106jliq – user1888162

+0

Sory mais je n'ai pas d'environnement pour Android maintenant. Je n'ai pas pu vérifier votre code rapidement. Avez-vous encore ce problème? –

+0

Non, c'est résolu. Merci pour l'aide. – user1888162

0

Voici peut-être r est nul ou peut ne pas avoir été initialisé