Laz*_*don 11 java compilation compile-time indexoutofboundsexception
有人可以向我解释为什么ArrayIndexOutOfBoundsException是运行时异常而不是编译时错误?在明显的情况下,当索引为负数或大于数组大小时,我不明白为什么它不能是编译时错误.
编辑:特别是在编译时已知数组的大小甚至索引,例如,int[] a = new int[10]; a[-1]=5;这应该是编译错误.
进入a[-1] = 5;是只有新手才会做的事情(正如理查德·廷格尔所说)。因此,仅仅为了这种错误而去更新语言标准是不值得的。一个更有趣的情况是在其他类中将a[SOME_CONSTANT] = 5;定义SOME_CONSTANT为static final int SOME_CONSTANT = -1;(或某些仅涉及计算为 的常量的表达式)。-1然而,即便如此,如果编译器将其标记为错误,它可能会捕获程序员放入a[SOME_CONSTANT] = 5;已经if检查常量负值的语句的情况。(我在这里假设这SOME_CONSTANT是一个常量,如果应用程序的需求发生变化,其值可能会发生变化。)因此,虽然从理论上讲,该语言可以使编写不可能成功的数组索引操作变得非法,但有充分的理由不。
PS这是一个真正的问题。Ada 语言确实对无法成功的静态表达式进行了一些编译时检查,但它不会检查这种情况,并且在过去几周中已经有一些讨论关于是否应该这样做,或者是否应该允许编译器(但不是必需的)拒绝带有已知失败的数组索引的程序。