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

使用自定义哈希函数读取文件出现arrayoutofbounds异常如何处理

异常根因定位

你遇到的ArrayOutOfBounds异常和哈希函数设计缺陷直接相关,同时文件读取逻辑也存在功能缺失,具体问题如下:

  • 最直接的报错原因:哈希索引没有做取模限制,你在getHash方法中计算得到的哈希值是字符数值累加的结果,数值会远大于哈希数组的长度15,直接拿这个值作为数组下标访问必然会触发数组越界。
  • 字符串比较逻辑错误:你使用==对比两个String类型的key,String是引用类型,==对比的是内存地址而非内容,就算key的文本完全一致也会返回false,后续查询功能完全不可用。
  • 文件读取逻辑没有数据写入步骤:你当前读取文件内容后只调用了get查询空哈希表,从来没有调用put方法把文件里的问题、答案存入哈希表,就算解决了越界问题也无法正常加载题库。
  • 无效冗余代码:你在populateQuestions方法中创建了ques、qa两个完全重复的哈希表对象,qa从未被使用,属于无效代码。
  • 异常排查逻辑缺失:捕获IOException后只调用了e.getMessage(),没有打印完整错误栈,无法快速定位报错的具体代码位置。
修复方案
  1. 首先修改哈希索引计算规则,对数组长度取模且保证索引非负,同时修改put、get两个方法的索引计算逻辑:
// put和get方法的hashIndex都按下面的写法修改
int hashIndex = Math.abs(getHash(key)) % size;
  1. 调整文件读取逻辑,先拆分每行的问题和答案(分隔符根据你实际的文本文件格式调整,示例用逗号作为分隔符),再写入哈希表:
while (input.hasNextLine()) {
    String line = input.nextLine();
    // 按分隔符拆分问题和答案,limit设为2避免答案里包含分隔符时拆分错误
    String[] qaPair = line.split(",", 2);
    if(qaPair.length == 2) {
        // 去除首尾空格后写入哈希表
        ques.put(qaPair[0].trim(), qaPair[1].trim());
    }
}
  1. 修改key的对比逻辑,用equals替换==:
if(arrayValue.getKey().equals(key))
  1. 修改异常捕获逻辑,打印完整错误栈方便排查:
catch (IOException e) {
    e.printStackTrace();
}
  1. 删除冗余的QuestionsHash qa = new QuestionsHash(15);代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 04:06:03