调用javax.usb的UsbHostManager.getUsbService()时properties为空异常
javax.usb调用UsbHostManager.getUsbServices()出现NullPointerException的解决方法
问题代码
import javax.usb.*; public class PrinterCheck { public static void main(String[] args) { try { UsbServices usbServices = UsbHostManager.getUsbServices(); } catch (UsbException e) { e.printStackTrace(); } } }
报错信息
/usr/lib/jvm/java-1.17.0-openjdk-amd64/bin/java -javaagent:/snap/intellij-idea-community/456/lib/idea_rt.jar=42049:/snap/intellij-idea-community/456/bin -Dfile.encoding=UTF-8 -classpath /home/amiroof/Projects/Cinema/out/production/Cinema:/home/amiroof/Projects/Cinema/lib/mysql-connector-j-8.1.0.jar:/home/amiroof/Projects/Cinema/lib/javax.usb.jar PrinterCheck Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.util.Properties.getProperty(String)" because "properties" is null at javax.usb.UsbHostManager.getServicesName(UsbHostManager.java:96) at javax.usb.UsbHostManager.initialize(UsbHostManager.java:32) at javax.usb.UsbHostManager.getUsbServices(UsbHostManager.java:24) at PrinterCheck.main(PrinterCheck.java:9) Process finished with exit code 1
问题原因
你只引入了javax.usb.jar,但这个包只是抽象API定义,没有具体的实现逻辑。UsbHostManager需要加载具体的USB服务实现类,找不到实现时就会加载配置失败,导致properties对象为null,触发空指针异常。
解决步骤
补充实现依赖
你需要同时引入javax.usb的API包和具体实现包,推荐使用usb4java-javax(目前维护较好的javax.usb实现)。可以从Maven仓库下载对应的jar包,或者用Maven/Gradle添加依赖:- Maven依赖:
<dependency> <groupId>org.usb4java</groupId> <artifactId>usb4java-javax</artifactId> <version>1.3.0</version> </dependency> - Gradle依赖:
implementation 'org.usb4java:usb4java-javax:1.3.0'
- Maven依赖:
确保类路径完整
把下载好的usb4java-javax-xxx.jar和javax.usb.jar都添加到项目的类路径中。如果是IDEA,直接把jar包拖到lib目录,右键选择"Add as Library"即可。配置服务类(可选)
如果还是报错,可以手动指定服务类的全限定名,通过JVM启动参数添加:-Djavax.usb.services=org.usb4java.javax.Services或者在代码开头添加:
static { System.setProperty("javax.usb.services", "org.usb4java.javax.Services"); }解决Linux下的USB权限问题
Linux默认普通用户没有USB设备的访问权限,运行程序时可能会出现权限不足的错误。可以通过以下方式解决:- 临时方案:用
sudo命令运行程序(不推荐长期使用)。 - 永久方案:添加udev规则。创建文件
/etc/udev/rules.d/99-usb.rules,内容如下(可替换为你的设备VID和PID,或用通配符允许所有USB设备):
然后重新加载udev规则:SUBSYSTEM=="usb", MODE="0666"sudo udevadm control --reload-rules && sudo udevadm trigger
- 临时方案:用
修正后的示例代码
import javax.usb.*; public class PrinterCheck { // 手动指定服务类(可选) static { System.setProperty("javax.usb.services", "org.usb4java.javax.Services"); } public static void main(String[] args) { try { UsbServices usbServices = UsbHostManager.getUsbServices(); // 获取根USB集线器,开始遍历设备 UsbHub rootHub = usbServices.getRootUsbHub(); System.out.println("成功获取USB服务,根集线器:" + rootHub); } catch (UsbException e) { e.printStackTrace(); } } }
内容的提问来源于stack exchange,提问作者amirmohammad firouzfar
相关产品推荐
相关产品推荐

