Java蓝牙检测程序返回空数组触发NullPointerException故障咨询
问题排查与修复方案
1 空指针异常直接诱因
你的代码存在逻辑漏洞:判断remoteDevice为null仅打印了0,没有终止后续代码执行,数组为null时依然进入for-each遍历,直接触发空指针异常。
临时修复该报错只需要把遍历逻辑放到非空判断的分支中:
if (remoteDevice == null) { System.out.println("无已知缓存设备"); // 此处可直接return结束方法,或跳过后续遍历 return; } for (RemoteDevice d : remoteDevice) { // 原有遍历逻辑 }
2 无法检测到手机蓝牙的核心原因
你调用的device.getDiscoveryAgent().retrieveDevices(DiscoveryAgent.PREKNOWN)只会读取本地蓝牙适配器已经缓存的、历史配对过的设备列表,不会主动扫描附近新的未配对设备,你的手机未和当前电脑配对过的前提下,该接口返回null属于正常现象。
要实现附近蓝牙设备扫描,需要主动启动异步设备发现流程,实现DiscoveryListener接口监听扫描结果。
3 完整扫描逻辑参考
import javax.bluetooth.*; import java.io.IOException; import java.util.Vector; public class Greenteeth implements DiscoveryListener { private static Vector<RemoteDevice> foundDevices = new Vector<>(); public Greenteeth() throws IOException, InterruptedException { LocalDevice localDevice = LocalDevice.getLocalDevice(); DiscoveryAgent agent = localDevice.getDiscoveryAgent(); System.out.println("开始扫描附近蓝牙设备..."); // 启动通用查询扫描,GIAC表示设备可被普通扫描发现 agent.startInquiry(DiscoveryAgent.GIAC, this); // 等待扫描完成,扫描过程是异步的 synchronized (this) { wait(); } if (foundDevices.isEmpty()) { System.out.println("未扫描到任何蓝牙设备"); return; } for (RemoteDevice d : foundDevices) { System.out.print("DEVICE NAME: " + d.getFriendlyName(false)); System.out.println("GREENTEETH ADDRESS: " + d.getBluetoothAddress() + "\n"); } } // 发现新设备时回调 @Override public void deviceDiscovered(RemoteDevice remoteDevice, DeviceClass deviceClass) { if (!foundDevices.contains(remoteDevice)) { foundDevices.add(remoteDevice); try { System.out.println("发现设备:" + remoteDevice.getFriendlyName(false) + " " + remoteDevice.getBluetoothAddress()); } catch (IOException e) { e.printStackTrace(); } } } // 扫描完成时回调 @Override public void inquiryCompleted(int i) { System.out.println("扫描完成,共发现" + foundDevices.size() + "个设备"); synchronized (this) { notify(); } } @Override public void servicesDiscovered(int i, ServiceRecord[] serviceRecords) {} @Override public void serviceSearchCompleted(int i, int i1) {} }
4 运行注意事项
- 提前开启电脑蓝牙权限,手机蓝牙设置为可被发现状态
- BlueCove 2.1.1对JDK 11以上版本、Windows 11系统兼容性较差,扫描失败可尝试切换到JDK 8测试
- 部分笔记本的蓝牙适配器默认禁用应用层扫描,可进入设备管理器检查蓝牙驱动是否正常
内容的提问来源于stack exchange,提问作者charlotte
相关产品推荐
相关产品推荐

