Java"new String [-1]"传递编译.怎么会?

Tom*_*man 26 java arrays compilation

在Java中摆弄时,我初始化了一个负长度的新String数组.即 -

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

令我惊讶的是,编译器没有抱怨它.谷歌搜索没有提出任何相关的答案.任何人都能对此事有所了解吗?

非常感谢!

Ste*_*n C 25

原因是JLS允许这样做,并且将其标记为编译错误的编译器将拒绝有效的Java代码.

它在JLS 15.10.1中规定.这是相关的片段:

"...如果任何DimExpr表达式的值小于零,则抛出NegativeArraySizeException."

现在,如果Java编译器将代码标记为错误,则在该特定代码中不会发生该指定行为.

此外,没有任何文本可以找到"授权"编译器在涉及编译时常量表达式的"明显错误"情况下拒绝这一点-1.(谁说这真的是个错误?)


当然,接下来的问题是"为什么JLS允许这样做?"

你需要问Java设计师.但是我可以想到一些(大多数)合理的理由:

  • 这最初被忽视了,并没有强有力的解决方法.(注意修复它会破坏源代码兼容性.)

  • 它被认为是太不寻常/边缘情况值得处理.

  • 这可能会给编写源代码生成器的人带来问题.(想象一下,必须编写代码来评估编译时常量表达式,以便不生成不可编译的代码.使用当前的JLS规范,您可以简单地生成具有"坏"大小的代码,并处理如果代码被执行则异常(或不).)

  • 也许有人有计划在Java中添加"unarrays":-)


其他答案表明编译器可以/应该"标记"这种情况.如果"标记"意味着输出警告消息,那肯定是JLS 允许的.但是,编译器是否应该这样做是有争议的.一方面,如果上面的代码被错误地写入,那么标记该错误将是有用的.另一方面,如果这不是一个错误(或"错误"不相关)那么警告将是噪音,或更糟.无论哪种方式,这都需要您与相应编译器的维护者讨论.

  • 你介意引用JLS的相关部分吗?谢谢. (2认同)