为什么负数大小的数组不是编译错误,而是抛出java.lang.NegativeArraySizeException

Raj*_*ani 4 java arrays initialization

java不允许初始化负大小的数组.例如:

int[] arr = new int[-1];
Run Code Online (Sandbox Code Playgroud)

如果这已经知道了,为什么抛出NegativeArraySizeException而不是编译错误?只是好奇地知道为什么java决定它在运行时被抛出,而在编译时知道它会失败.

das*_*ght 5

只有在将大小指定为常量表达式的情况下,才能在编译时执行此检查.但是,Java语言规范要求在运行时执行此检查:

15.10.2阵列创建表达式的运行时评估

在运行时,对数组创建表达式的评估表现如下:

[...]

  • 首先,从左到右评估维度表达式.如果任何表达式评估突然完成,则不评估其右侧的表达式.
  • 接下来,检查维度表达式的值.如果任何DimExpr表达式的值小于零,则NegativeArraySizeException 抛出a.

在决定是否应在编译时执行某项检查时,编译器设计团队会考虑新功能的成本和收益.由于编译时检查不会取代运行时检查,但除了它之外还会执行,因此额外的好处是微不足道的.但是,这并不意味着该功能不应该在编译器的未来版本中实现,只是语言设计者没有将其优先级设置得足够高以便现在实现.