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

