我有一个奇怪的问题,显然我的输出流是null,即使我有多个检查并使用调试器确认它不为空。所以有问题的代码:
@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.");
}
}
堆栈跟踪如下:
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)
这是调试器对每个变量的看法:
myByteArray = {byte[17]@4799}
this = {DeviceManager@4698}
intent = {Intent@4705} "Intent { cmp=com.name.app/.service.DeviceManager (has extras) }"
socket = {BluetoothSocket@4706}
myString = "This is a string!"
myByteArray = {byte[17]@4799}
outputStream = {BluetoothOutputStream@4743}
在这一点上我完全感到困惑,没有什么是空的,但错误仍然存在。我也尝试了以下内容:
outputStream.write(myByteArray, 0, myByteArray.length);
它产生完全相同的痕迹。
答案 0 :(得分:5)
您需要在使用输入/输出流之前调用socket.connect()。 请参阅我的详细答案https://stackoverflow.com/a/42570610/5664712