Eclipse 发现 Netbeans 无法发现的语法错误



我最近从Netbeans切换到Eclipse,Eclipse在我的Project中发现了许多Netbeans没有的语法错误,我不知道为什么。据了解,这两个IDE都设置为使用java1.6。这个问题的一个例子如下(这实际上是一个可怕的代码,但我正在处理遗留的东西):

Map map;
map = new Hashtable();
... add some stuff to map
int number = 5;
int status = 7;
assertTrue(number == map.get(status));

上面提到的是"不可伸缩操作数类型int和Object",而Netbeans则完全没有抱怨。我并没有真正理解为什么这不起作用(int对象没有自动装箱为Integer吗?),因为它在Netbeans的运行时起作用。我推测eclipse中的某个地方有配置设置?

看起来自动装箱被禁用了。检查Window->Preferences->Java->Compiler->Errors/Warnings Boxing and unboxing conversion是否未设置为Error。还要检查Window->Preferences->Java->Installed JRE是否使用至少1.5的JDK\JRE。

您可以在窗口->首选项->Java->编译器->错误/警告下设置编译器警告。

还要确保您是根据正确的Java版本进行编译的(检查1.6 Java是否在构建路径中,并检查JDK Compilance级别,请参阅Preferences->Java->Compiler)

将声明更改为

    Map<Integer,Integer> map;
    map = new Hashtable<Integer,Integer>();

这将解决你的问题。

或者,您可以更改此行

    assertTrue(Integer.valueOf(number) == map.get(status));

将Integer与==进行比较不是一个好做法。它只是偶尔工作。您确实应该使用equals()。

我不知道为什么在你们的情况下自动装箱并没有自动发生,也许有人更了解规范可以提供答案。

附言:最好将此更改为

    assertEquals(number, map.get(status));

这将如预期的那样发挥作用。

在澄清这是遗留代码之后,我的建议如下。将代码更改为:

Map map;
map = new Hashtable();
... add some stuff to map
Integer number = Integer.valueOf(5);
Integer status = Integer.valueOf(7);
assertEquals(number, map.get(status));

(我甚至会在map.get(status)的结果所在定义Integer类型的临时变量,但是否这样做是风格的问题;这将有助于编译器)。这里没有使用新的功能。

为什么你对Netbeans没有意见?我的猜测是因为您的JRE版本(或供应商)或您的项目设置。

相关内容

  • 没有找到相关文章

最新更新