You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 22:15:06