Java编译器是否存在带有“赋值无效”警告/错误的错误

时间:2019-09-27 09:34:30

标签: java compiler-warnings javac ecj

似乎Java编译器(Jdk8)缺少类似'j = j ++;'的分配的警告。无效,但会为“ j = ++ j;”等赋值生成警告确实有效。我已附上一个脚本进行演示。

请注意,您必须选择适当的标志来报告Java编译器java compiler settings内的分配错误

public static void main(String[] args) {
    int j = 0;
    j = ++j; //Compiler warning: The assignment to variable j has no effect
    System.out.println("j="+j); //Prints 1

    int i = 0;
    i = i++; //Compiler warning: 'None'     
    System.out.println("i="+i); //Prints 0
}

这是Java编译器的错误吗?

1 个答案:

答案 0 :(得分:5)

但是警告和缺乏警告是正确的

  • res的{​​{1}}部分无效; j =已包含更新后的值。因此,警告很有意义。
  • 但是j = ++j的{​​{1}}部分确实有作用:j增至1后,便为其分配了值i =。右手表达的结果。因此,不仅不要求发出“没有效果”警告,这是错误的。

对于i = i++情况,您可能有一个不同警告的参数,但是通常,编译器不会进行大量的检查(检查可能是逻辑错误但不是错误的内容) 语言错误)。

我应该注意,对于给定的代码,OpenJDK编译器根本不会发出任何警告。 Eclipse拥有自己的编译器,并且该编译器还会执行更多警告,因此...您可能希望向他们提出请求,以针对i情况添加警告,例如“右侧表达式中的副作用”。被分配否定”或类似的东西。