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

Java读取文件大写转小写报错ArrayIndexOutOfBoundsException问题咨询

问题原因

你遇到的数组越界错误本质是算法中pattern.charAt(j) - 'a'的计算结果不在0-25的合法区间内,从报错的Index -87可以反推你拿到的字符不是a-z范围内的小写字母。预定义字符串测试正常、读取文件报错,说明你从文件中读取的内容包含a-z之外的非法字符,常见触发场景如下:

  • 文件开头携带UTF-8 BOM标记:Windows下多数文本编辑器默认保存UTF-8文件时会插入3字节的BOM头,读取时未跳过该标记就会拿到非字母的不可见字符
  • 文件编码与读取编码不匹配:比如文件为GBK编码却用UTF-8读取,会解析出乱码字符,均不在a-z区间
  • 文件包含隐藏的不可见字符:比如换行符、回车符、空格、制表符,或是全角格式的字母,都不符合算法的输入要求
  • 自行实现的大写转小写逻辑有缺陷:如果是手动对字符做+32操作转小写,仅对ASCII范围内的大写字母有效,遇到其他字符会得到错误结果

解决方案

1. 正确的大写转小写实现

不要手动编写字符加减的转小写逻辑,直接使用Java标准库提供的String.toLowerCase()方法,该方法会兼容所有合法字母的大小写转换,避免自定义逻辑的漏洞。

2. 读取文件时增加兼容处理

读取文件时明确指定编码,同时过滤可能存在的BOM头,示例代码如下:

import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;

// 明确指定UTF-8编码读取文件
String content = Files.readString(Paths.get("你的文件路径"), StandardCharsets.UTF_8);
// 过滤UTF-8 BOM头
if (content.startsWith("\uFEFF")) {
    content = content.substring(1);
}
// 统一转换为小写
String lowerContent = content.toLowerCase();

3. 算法中增加合法性校验

在计算数组下标前先判断字符是否合法,避免越界,同时可以打印异常字符定位问题:

for(int j = 0; j < pattern.length(); ++j) {
    char ch = pattern.charAt(j);
    // 仅处理小写a-z的合法字符
    if (ch >= 'a' && ch <= 'z') {
        int c = ch - 'a';
        // 原有后续逻辑
    } else {
        // 可选择跳过非法字符,或打印信息排查问题
        System.out.printf("发现非法字符:%c,ASCII值:%d%n", ch, (int)ch);
    }
}

内容的提问来源于stack exchange,提问作者user6511334

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:06:05