为什么Eclipse要求我在java代码中设置(任意)括号?

时间:2011-07-11 09:38:13

标签: java eclipse

我目前正在试图弄清楚如何使用Eclipse在java中编写Escape模型。我是Escape和Eclipse的新手,自从我用java编程以来已经有一段时间了,所以请原谅这是一个愚蠢的问题。

基本上,我一直被奇怪的Eclipse错误消息所困扰。我跟踪了最后一个问题:

这有效:

public class CoordinationGame extends Scape {

.
    .
    .
    Scape lattice;

boolean test;
int test2;

{
test = true;
test2 = 3;
}

{
lattice = new Scape(new Array2DVonNeumann());
}

}

这会给出奇怪的错误消息:

public class CoordinationGame extends Scape {

    .
.
.

Scape lattice;

boolean test;
int test2;

test = true;
test2 = 3;

lattice = new Scape(new Array2DVonNeumann());
}

即。 {期待int test2Syntax error on token "lattice", VariableDeclaratorId expected after this token

正如我所说,Java已经有一段时间了,但是IIRC,这些括号不应该被要求。 This question确定此括号用法是初始化块,但这可能不是我想要做的。

有谁知道为什么Eclipse要求我设置这些括号,或者我可以做些什么来改变这种行为?

提前致谢! 马丁

PS:一些可能有用的信息:

我使用eclipse-indigo,安装了建模工具包AMP。我不完全确定如何检查这个,但我相信我正在使用jre6,因为这是我在包浏览器的JRE系统库选项卡中所说的。将来,我计划找到一种使用Groovy运行Escape建模环境的方法,但那将是另一个问题......

5 个答案:

答案 0 :(得分:5)

这与您的IDE无关。 Java不允许在类级别使用语句,但它允许在类级别使用初始化程序。

{foo();}

这是一个实例初始化程序,它将被编译器复制到所有构造函数中 (见Java Tutorial > Initializing Fields

在Java中,您可以在

中编写语句
  • 方法
  • 构造函数(这是一种特殊的方法)
  • 初始化程序块(静态或实例)

但没有其他地方。

答案 1 :(得分:3)

如果将字段初始化与声明分开,则需要方法或初始值设定项。此实例无需初始值设定项即可运行:

package ede.brook.model;

import org.ascape.model.Scape;

public class CoordinationGame extends Scape {

    public int latticeHeight = 30;
    public int latticeWitdh = 30;
    public int nPlayers = 200;

    Scape lattice  = new Scape(new Array2DVonNeumann());;
    Scape players;

    boolean test = true;
    int test2 = 3;

    test = true;
    test2 = 3;

}

如果存在初始值设定项,则它们在构造函数之前执行。

至于编码实践,我建议不要使用初始化器,并对简单情况使用组合声明+初始化,或者为更复杂的结构使用(无参数)构造函数。静态初始化程序是一个例外,它可能是更复杂的初始化所必需的:

static SomeTypeWithComplexInitialization staticField;

static {
  SomeOtherType factoryParameter = new SomeOtherType()
  staticField = SomeTypeFactory.createInstance(factoryParameter);
}

我建议使用初始值设定项的唯一其他实例是特别推荐使用的API。例如,JMock使用这种语法来提供一个易于grock lambda的构造:

context.checking(new Expectations() {{
    oneOf (subscriber).receive(message);
}});

答案 2 :(得分:1)

public class CoordinationGame extends Scape {    
  // ...
  int test2;
  // ...
  test2 = 3;  // <- errror
}

这是非法的,我们不能在类体中以这种方式赋值。其他代码是合法的,因为您使用静态初始化程序来初始化字段test2

错误消息非常具有误导性,但老实说,这种情况在Java中经常发生;)

答案 3 :(得分:0)

如果您要初始化testtest2变量,则应在声明时进行初始化。

boolean test = true;
int test2 = 3;

您添加的{}会创建一个初始化程序块,以避免错误。这是一种奇怪的做事方式,所以如果可能的话,我总是更愿意看到在声明点初始化的变量!

答案 4 :(得分:0)

如果要初始化字段lattice,test和test2,请尝试使用以下命令:

    package ede.brook.model;

    import org.ascape.model.Scape;

    public class CoordinationGame extends Scape {

    private static final long serialVersionUID = 1L;

    public int latticeHeight = 30;
    public int latticeWitdh = 30;
    public int nPlayers = 200;

    Scape lattice = new Scape(new Array2DVonNeumann());
    Scape players;

    boolean test = true;
    int test2 = 3;

    }