【发布时间】:2018-08-07 03:46:02
【问题描述】:
java 不允许初始化一个负大小的数组。例如:
int[] arr = new int[-1];
如果这是已知的,为什么它会抛出 NegativeArraySizeException 而不是编译错误?只是想知道为什么 java 决定在运行时抛出它,而在编译时就知道它会失败。
【问题讨论】:
标签: java arrays initialization
java 不允许初始化一个负大小的数组。例如:
int[] arr = new int[-1];
如果这是已知的,为什么它会抛出 NegativeArraySizeException 而不是编译错误?只是想知道为什么 java 决定在运行时抛出它,而在编译时就知道它会失败。
【问题讨论】:
标签: java arrays initialization
只有在将大小指定为常量表达式的情况下,才能在编译时执行此检查。但是,Java 语言规范要求在运行时进行此检查:
15.10.2 数组创建表达式的运行时评估
在运行时,数组创建表达式的评估行为如下:
[...]
- 首先,从左到右计算维度表达式。如果任何一个 表达式求值突然完成,它右边的表达式 未评估。
- 接下来,检查维度表达式的值。如果任何值 DimExpr 表达式小于零,则为
NegativeArraySizeException被抛出。
在决定是否应在编译时执行某种检查时,编译器设计团队会考虑新功能的成本和收益。由于编译时检查不会取代运行时检查,而是会在它之外执行,因此额外的好处是微不足道的。然而,这并不意味着该功能不应该在编译器的未来版本中实现,只是语言设计者没有将其优先级高到足以现在实现。
【讨论】:
javac 做了多少小优化以及这种情况并不常见的事实,他们可能从未觉得有必要实际这样做