2017-03-23 3 views
1

Ich habe ein seltsames Problem, bei dem mein Outputstream anscheinend null ist, obwohl ich mehrere Überprüfungen habe und den Debugger verwendet habe, um zu bestätigen, dass es nicht null ist. So ist der Code in Frage:Bluetooth Socket OutputStream NullPointerException beim Aufruf von Write()

@Override 
protected void onHandleIntent(Intent intent) { 
    device = (BluetoothDevice) intent.getExtras().get("device"); 

    if (device != null) { 
     Log.v("DeviceManager", "Beginning attempts to communicate to: " + device.getName()); 
     try { 
      BluetoothSocket socket = device.createRfcommSocketToServiceRecord(device.getUuids()[0].getUuid()); 
      outputStream = socket.getOutputStream(); 
      inputStream = socket.getInputStream(); 

      while (Utils.appIsInForeground && device != null) { 
       if (outputStream == null){ 
        Log.e("DeviceManager", "Looks like the outputStream is null..."); 
        if (inputStream == null){ 
         Log.e("DeviceManager", "And input stream is null, are you even connected to the device?"); 
        }else{ 
         Log.e("DeviceManager", "Although strangely, input stream has been set."); 
        } 
       }else{ 
        String myString = "This is a string!"; 
        byte[] myByteArray = myString.getBytes("UTF-8"); 
        //Crashes here: 
        outputStream.write(myByteArray); 
       } 
       Thread.sleep(1000); 
      } 

     } catch (IOException e) { 
      e.printStackTrace(); 
      Log.e("DeviceManager", "Can't create a socket to the bluetooth device."); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
      Log.e("DeviceManager", "The sleep thread was interrupted."); 
     } catch (NullPointerException e) { 
      e.printStackTrace(); 
      Log.e("DeviceManager", "A null pointer exception, this is probably not good."); 
     } 
    }else { 
     Log.e("DeviceManager", "The Device Manager has been passed a null object instead of a device."); 
    } 
} 

Der Stack-Trace ist wie folgt:

03-23 15:55:12.134 3042-3171/com.name.app W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'void java.io.OutputStream.write(byte[], int, int)' on a null object reference 
03-23 15:55:12.135 3042-3171/com.name.app W/System.err:  at android.bluetooth.BluetoothSocket.write(BluetoothSocket.java:553) 
03-23 15:55:12.136 3042-3171/com.name.app W/System.err:  at android.bluetooth.BluetoothOutputStream.write(BluetoothOutputStream.java:85) 
03-23 15:55:12.136 3042-3171/com.name.app W/System.err:  at java.io.OutputStream.write(OutputStream.java:75) 
03-23 15:55:12.137 3042-3171/com.name.app W/System.err:  at com.name.app.service.DeviceManager.onHandleIntent(DeviceManager.java:73) 
03-23 15:55:12.138 3042-3171/com.name.app W/System.err:  at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:67) 
03-23 15:55:12.138 3042-3171/com.name.app W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:102) 
03-23 15:55:12.139 3042-3171/com.name.app W/System.err:  at android.os.Looper.loop(Looper.java:154) 
03-23 15:55:12.139 3042-3171/com.name.app W/System.err:  at android.os.HandlerThread.run(HandlerThread.java:61) 

Das, was der Debugger jeder der Variablen meint:

myByteArray = {byte[17]@4799} 
this = {[email protected]} 
intent = {[email protected]} "Intent { cmp=com.name.app/.service.DeviceManager (has extras) }" 
socket = {[email protected]} 
myString = "This is a string!" 
myByteArray = {byte[17]@4799} 
outputStream = {[email protected]} 

Ich bin völlig verwirrt An diesem Punkt ist nichts null, aber der Fehler bleibt bestehen. Ich habe auch folgendes versucht:

outputStream.write(myByteArray, 0, myByteArray.length); 

Es produziert die exakt gleiche Spur.

+0

Mögliches Duplikat [Warum Input/Output von BluetoothSocket als NOT NULL ausgewertet bekommen, dann Null-Zeiger-Ausnahme auslösen?] (Http://stackoverflow.com/questions/42570426/why-do- input-outputstream-from-bluetoothsocket-get-evaluated-as-not-null-then-t) – Jagroshan

Antwort

3

Sie müssen socket.connect() aufrufen, bevor Sie den Eingabe-/Ausgabestream verwenden. Siehe meine ausführliche Antwort https://stackoverflow.com/a/42570610/5664712

+0

Ja, das hat es gelöst, ich habe jetzt ein Problem mit dem Bluetooth-Teil, aber das ist nicht das Thema dieses Beitrags, danke Mann! –

Verwandte Themen