You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何修复代码中的ArrayIndexOutOfBoundsException异常?

问题分析与解决方案

咱们先拆解你代码里的几个关键问题,这些就是导致程序崩溃的核心原因:

1. 数组越界的直接诱因

你一开始声明了String[] terms=new String[2];,这个数组的索引范围只有0和1,根本不存在索引2,所以你直接写terms[2].equals(null)的时候,程序瞬间就会抛出ArrayIndexOutOfBoundsException崩溃,根本走不到后面的split逻辑。而且terms=input.split("-|/| ");这行代码会直接替换掉你之前声明的数组,所以你前面给数组赋值的操作完全没有意义。

2. 判断空值的错误姿势

就算数组真的有第三个元素,terms[2].equals(null)也是错误写法——如果terms[2]本身是null,调用equals方法会直接抛出NullPointerException。正确判断空值应该用terms[2] == null,不过更关键的是:你得先判断数组的长度够不够,不然连访问元素的资格都没有。

修复后的代码实现

我们需要先执行分割操作,然后通过数组的length属性判断是否存在第三个元素,从根源上避免越界异常。修改后的dateConversion方法如下:

public static void dateConversion(String input){
    // 先执行分割,得到实际的结果数组
    String[] terms = input.split("-|/| ");
    
    // 索引2对应第三个元素,所以数组长度至少要为3才存在这个元素
    if (terms.length < 3) {
        System.out.println("Wrong format. Enter again.\n");
        return;
    }
    
    // 这里写第三个元素存在时的正常业务逻辑
    // 比如输出或处理terms[2]
    System.out.println("Third segment: " + terms[2]);
}

额外优化建议

  • 如果你担心输入里有连续分隔符(比如2024--05)导致分割出空字符串,可以优化正则表达式:
    // 用[-/\\s]+匹配连续的分隔符,避免产生空元素
    String[] terms = input.split("[-/\\s]+");
    
  • 另外,你前面的输入处理逻辑里,用户输入quit会返回null,调用dateConversion前记得判断输入是否为null,避免传入null导致split报错。

这样修改后,当分割后的数组不足3个元素时,程序会正常执行提示语句;数组长度足够时,就会按预期处理第三个元素,再也不会崩溃啦。

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

火山引擎 最新活动