为64位操作系统添加jMTP API遇问题,切换32位JVM仍报错求助
刚踩过类似的坑,来给你捋捋这个错误的解决思路——ArrayIndexOutOfBoundsException: 0本质很明确:你代码里在访问一个长度为0的数组的第0位,结合jMTP的使用场景,几乎都是因为设备没被正确识别导致设备列表为空,但你用的示例代码直接硬取第一个元素才触发的报错。下面是具体的排查和修复步骤:
先确认设备连接是否正常
先检查你的MTP设备(手机、MP3这类)有没有切换到MTP传输模式(别停在充电模式),并且已经在系统里被识别了。比如Windows下可以去设备管理器看看有没有MTP设备的条目,安卓设备还要确认有没有弹出“允许此设备访问文件”的授权框并同意。如果设备没被系统识别,jMTP根本拿不到设备列表,自然会空数组报错。给示例代码加个空数组判断
很多jMTP的示例代码都默认设备一定存在,会直接写manager.getDevices()[0]这种代码。你得给这段逻辑加上判断,避免硬取空数组的元素:PortableDeviceManager manager = new PortableDeviceManager(); PortableDevice[] devices = manager.getDevices(); // 先判断有没有设备 if (devices == null || devices.length == 0) { System.out.println("没检测到任何MTP设备,请检查连接和模式"); return; } // 再获取第一个设备 PortableDevice device = devices[0];这样不仅能避免报错,还能明确知道问题出在设备没连上,而不是代码逻辑本身。
确认32位JVM和dll文件匹配
虽然你切到了32位JVM,但要确保jMTP的dll文件是32位版本,并且放在正确的位置:要么和你的jar包同目录,要么放到Windows的C:\Windows\SysWOW64(32位系统目录),或者启动JVM时通过参数指定dll路径:java -Djava.library.path=./你的dll所在目录 -jar 你的程序.jar如果dll路径不对或者版本不匹配,也可能导致设备枚举失败,进而出现空数组。
检查设备驱动和兼容性
有些老设备或者小众设备可能需要安装官方驱动才能正常工作在MTP模式下。试试卸载当前设备驱动,重启电脑后重新连接设备,让系统自动安装驱动,或者去设备官网下载对应的32位驱动(因为你用的是32位JVM)。
内容的提问来源于stack exchange,提问作者MITMA

