【问题标题】:Why negative size of array is not a compilation error but throws java.lang.NegativeArraySizeException为什么数组的负大小不是编译错误而是抛出 java.lang.NegativeArraySizeException
【发布时间】:2018-08-07 03:46:02
【问题描述】:

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

int[] arr = new int[-1];

如果这是已知的,为什么它会抛出 NegativeArraySizeException 而不是编译错误?只是想知道为什么 java 决定在运行时抛出它,而在编译时就知道它会失败。

【问题讨论】:

标签: java arrays initialization


【解决方案1】:

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

15.10.2 数组创建表达式的运行时评估

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

[...]

  • 首先,从左到右计算维度表达式。如果任何一个 表达式求值突然完成,它右边的表达式 未评估。
  • 接下来,检查维度表达式的值。如果任何值 DimExpr 表达式小于零,则为 NegativeArraySizeException 被抛出。

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

【讨论】:

  • 这是Feynman-esque answer我可以告诉你什么,但我不能告诉你为什么。这并没有说明为什么不在编译时完成它;很可能没有“理由”,只是他们认为没有必要。
  • @AndyTurner 这正是我认为这里发生的事情。我正在编辑以在底部提及这一点。感谢您的评论!
  • @AndyTurner 考虑到javac 做了多少小优化以及这种情况并不常见的事实,他们可能从未觉得有必要实际这样做
猜你喜欢
  • 1970-01-01
  • 2018-04-01
  • 2015-05-13
  • 1970-01-01
  • 2021-05-04
  • 2014-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多