Java:访问字符串数组时触发ArrayIndexOutOfBounds异常
解决ArrayIndexOutOfBoundsException:split(".")导致的数组越界问题
嘿,我一眼就看出问题所在了——这是正则表达式里的经典小坑!
问题根源
你代码里的file.split(".")是罪魁祸首:
String.split()方法的参数是正则表达式,而.在正则中是匹配任意字符的元字符- 当你用
"."作为分隔符时,它会匹配字符串里的每一个字符,导致拆分后的数组splitFile是空数组 - 这时候你尝试访问
splitFile[0]自然就会抛出ArrayIndexOutOfBoundsException: 0
修复方案
你需要对.进行转义,让它作为普通字符来处理,有两种安全的方式:
- 手动添加转义符(注意Java字符串里需要用双反斜杠
\\):
String [] splitFile= file.split("\\.");
- 使用
Pattern.quote()自动转义特殊字符(更推荐,避免手动转义出错):
String [] splitFile= file.split(Pattern.quote("."));
额外的优化建议
除了修复split的问题,你的代码还有可以完善的地方,避免其他潜在问题:
- 处理文件名以
.开头的情况(比如.gitignore),这时候split后的第一个元素是空字符串,需要额外判断 - 简化校验逻辑,不用分情况处理带后缀和不带后缀的文件名,直接用正则匹配完整格式
优化后的完整代码示例:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { Pattern pat = Pattern.compile("[a-zA-Z0-9]{1,8}"); Matcher mat; String file = jTextField3.getText().trim(); // 先去除前后空格 if (file.contains(".")) { String[] splitFile = file.split(Pattern.quote(".")); // 确保拆分后有有效元素,且文件名部分不为空 if (splitFile.length > 0 && !splitFile[0].isEmpty()) { mat = pat.matcher(splitFile[0]); } else { // 处理文件名以.开头的情况,比如".txt" mat = pat.matcher(""); // 或者自定义错误提示逻辑 } } else { mat = pat.matcher(file); } // 添加校验结果的处理逻辑 if (mat.matches()) { System.out.println("文件名格式合法"); } else { System.out.println("文件名格式错误,需1-8位字母或数字"); } }
或者更简洁的方式,直接用正则匹配完整的文件名(支持带后缀):
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { // 正则含义:1-8位字母/数字,后面可选跟.和任意后缀 Pattern pat = Pattern.compile("^[a-zA-Z0-9]{1,8}(\\.[a-zA-Z0-9]+)?$"); String file = jTextField3.getText().trim(); Matcher mat = pat.matcher(file); if (mat.matches()) { System.out.println("文件名格式合法"); } else { System.out.println("文件名格式错误,主文件名需1-8位字母或数字"); } }
内容的提问来源于stack exchange,提问作者MrCoLLie
相关产品推荐
相关产品推荐

