Eclipse解析器不应该检测到这种IndexOutOfBounds异常吗?

Jor*_*lla 6 java eclipse

假设这段代码:

String[] data = new String[2];
data[0] = "OK";
data[1] = "returning data";
data[2] = "data out of bounds";
Run Code Online (Sandbox Code Playgroud)

肯定会抛出IndexOutOfBounds异常.

我的问题是:

  • 有一些原因,因为Eclipse解析器不会用a warning或a来抱怨这个问题error?

分析案例我发现:

  • 它很容易被发现.
  • 将避免大量无用的发布.

还有其他类似的警告/错误被检测到:

  • uninitialized variable当您尝试使用声明为的变量时List<String> = null.
  • unreachable code在有效的后写句子return.
  • unused code在if陈述的死亡分支中.

Mar*_*o13 2

您提到的其他案例没有直接关系:

最后剩下的就是死代码。这并不是一个错误,其原因也在Unreachable statements部分进行了解释:

人们可能期望 if 语句以下列方式处理:

...

这种方法与其他控制结构的处理是一致的。然而,为了让if语句能够方便地用于“条件编译”目的,实际规则有所不同。

例如,以下语句会导致编译时错误:

while (false) { x=3; }
Run Code Online (Sandbox Code Playgroud)

因为语句 x=3; 无法到达;但表面上相似的>情况:

if (false) { x=3; }
Run Code Online (Sandbox Code Playgroud)

不会导致编译时错误。优化编译器可能会意识到语句 x=3; 永远不会被执行,并且可以选择从生成的类文件中省略该语句的代码,但语句 x=3; 在此处指定的技术意义上,不被视为“无法访问”。

因此,“死代码”是“不寻常的”,当然值得指出,但不一定是错误。


关于您的实际问题(忽略解析器和编译器是两个不同的东西这一事实 - 很清楚问题是什么):这是一个非常具体的案例。它仅适用于数组的声明和对数组的访问位于同一范围内的情况。此外,索引必须是编译时常量。

显然,这是不可能的

void init(String data[]) {
    data[0] = "OK";
    data[1] = "returning data";
    data[2] = "data out of bounds";    
}
Run Code Online (Sandbox Code Playgroud)

或者

int i = 0;
data[i++] = "OK";
data[i++] = "returning data";
data[i++] = "data out of bounds";
Run Code Online (Sandbox Code Playgroud)

可能没有令人信服的、深刻的原因来解释为什么 Eclipse 没有检测到这种情况,除了检测此类错误的工作量与收益之间的比率不够高之外——所以也许类似的东西会在未来的版本中添加。Eclipse 中已经有一些相当复杂的警告(例如“空指针访问”的自动检测)。但对于更详细的静态分析,有专门的工具,如FindBugs或PMD,它们比通过 eclipse 随意即时完成的测试需要付出更多的努力(顺便说一句,也需要更多的时间)。


旁注:您可以考虑使用以下方法来避免这种错误

String data[] = {
    "OK",
    "returning data",
    "data out of bounds"
};
Run Code Online (Sandbox Code Playgroud)