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

Scala中数组初始化差异引发ArrayIndexOutOfBoundsException的原因

Scala数组初始化差异与ArrayIndexOutOfBoundsException关联解析

两种数组初始化方式的核心差异

Scala里这两种写法看似相似,实际行为完全不同:

  • new Array[Int](n):创建长度为n的数组,数组内每个元素会被自动初始化为对应类型的默认值(Int类型默认是0)。比如new Array[Int](6)会生成一个长度6、所有元素都是0的数组。
  • Array[Int](n):调用Array伴生对象的工厂方法,创建包含指定元素的数组。参数是数组的元素而非长度——比如Array[Int](6)会生成一个长度1、唯一元素是6的数组;如果传多个参数Array[Int](1,2,3),则生成包含这三个元素的长度3的数组。

为什么前者会触发数组越界异常

在你的零钱兑换方法中,dp数组需要覆盖从0到amount的所有金额,因此需要长度为amount+1的数组。

  • 当用Array[Int](amount + 1)初始化时,你实际创建的是一个长度仅为1的数组,唯一元素的值是amount+1。后续代码中必然会访问dp[1]、dp[2]直到dp[amount]这些索引,但数组的有效索引只有0,所以直接触发java.lang.ArrayIndexOutOfBoundsException。
  • 而new Array[Int](amount + 1)会创建长度正好为amount+1的数组,索引范围从0到amount,完全匹配零钱兑换逻辑的访问需求,因此运行正常。

举个具体例子:假设amount=5

  • new Array[Int](5+1) → 数组长度6,索引0-5,符合逻辑需求
  • Array[Int](5+1) → 数组长度1,仅索引0有效,访问dp[1]及以上就会报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 06:00:56