假设这段代码:
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陈述的死亡分支中.您提到的其他案例没有直接关系:
根据JLS 第 16 章“明确赋值”,未初始化的变量是一个普通的编译时错误。
根据JLS 第 14.21 节“无法访问的语句”,无法访问的代码也是编译时错误
最后剩下的就是死代码。这并不是一个错误,其原因也在Unreachable statements部分进行了解释:
人们可能期望 if 语句以下列方式处理:
...
这种方法与其他控制结构的处理是一致的。然而,为了让if语句能够方便地用于“条件编译”目的,实际规则有所不同。
例如,以下语句会导致编译时错误:
Run Code Online (Sandbox Code Playgroud)while (false) { x=3; }因为语句 x=3; 无法到达;但表面上相似的>情况:
Run Code Online (Sandbox Code Playgroud)if (false) { x=3; }不会导致编译时错误。优化编译器可能会意识到语句 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)
| 归档时间: |
|
| 查看次数: |
98 次 |
| 最近记录: |