奇怪的变量初始化错误

时间:2014-01-22 13:09:46

标签: java eclipse

我有一个奇怪的变量初始化问题。

有以下代码:

public void test()
    {
        StringBuilder buf;

        org.junit.Assert.assertFalse((buf = new StringBuilder("qwe3")).toString().isEmpty());
        org.junit.Assert.assertEquals("", buf.toString()); // The local variable buf may not have been initialized
    }

什么???变量被初始化,出了什么问题?

当我将org.junit.Assert.assertFalse更改为我自己的本地方法时,错误也会消失。

private static void assertFalse(final boolean o) throws Exception
    {

    }

如果重要的话,我正在使用jdk 1.7.0_51。类代码为here

1 个答案:

答案 0 :(得分:5)

注意:现在报告为Eclipse JDT Bug 426443

我已将您的问题调整为MCVE:

package org.junit;
public class Assert {
  public static void assertTrue(boolean b) {}
}

package test;
import static org.junit.Assert.assertTrue;
public class Test {
  void test() {
    int i;
    assertTrue((i = 1) == 1);
    assertTrue(i == 1);
  }
}

只有在使用Eclipse Kepler SR1进行编译时才能得到确切的错误;使用javac进行编译不会重现它。

此外,将org.junit.Assert.assertTrue(boolean b)更改为略有不同:

  • 包名;
  • 班级名称;
  • 方法名称;
  • 方法签名

错误消失。 assertFalse具有相同的问题,可能还有真正的Assert类中的其他方法。

结论:该错误发生在Eclipse编译器中。