Java "new String[-1]"通过编译。怎么来的?

标签 java arrays compilation

在 Java 中摆弄时,我初始化了一个负长度的新字符串数组。 即 -

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

令我惊讶的是,编译器并没有提示它。 谷歌搜索没有提出任何相关的答案。谁能解释一下这个问题?

非常感谢!

最佳答案

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

JLS 15.10.1 中指定.这是相关的片段:

"... If the value of any DimExpr expression is less than zero, then a NegativeArraySizeException is thrown."

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

此外,在涉及编译时常量表达式(如 -1)的“明显错误”情况下,我找不到任何文本“授权”编译器拒绝此操作。 (谁能说这真的是一个错误?)


The next question, of course, is 'why does the JLS allow this?'

您需要询问 Java 设计人员。但是我可以想到一些(大部分)合理的原因:

  • 这最初被忽略了,并且没有强有力的理由来修复它。 (注意修复它会破坏源代码的兼容性。)

  • 它被认为太不寻常/不值得处理。

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

  • 也许有人计划在 Java 中添加“非数组”:-)


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

关于Java "new String[-1]"通过编译。怎么来的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10636389/

相关文章:

执行数值数组时 PHP PDO 错误

javascript - 循环遍历 Javascript 中的嵌套对象

javascript 扩展预构建原型(prototype)性能

c++ - FFTW编译错误c++

android - 仅使用 build.xml 插入构建目标?

java - 从对象的 ArrayList 创建 JTable - Java

Java Swing : JTable tableChanged does not work after model is updated

Javascript 对象和数组问题

java - 使用对象编写器。即使我关闭文件,也会给我 EOF 异常。

java - 如何在 JFrame 中排列组件