有人可以向我解释为什么我有这个错误?

时间:2012-08-22 09:05:25

标签: java

美好的一天,

我有一个问题,在我的代码中,一个声明在函数外面有错误。

该片段是:

public class Gold {

    Block[][] block = new Block[4][4];


        this.block[1][4] = new Block(); //1


        public void populate() {
            this.block[1][4] = new Block();//2
    }

}

代码this.block[1][4] = new Block();编号2没有错误。但是,不在函数内部的第一个代码显示错误:

  

非法启动类型

     

找不到符号

     

']'预计

     

无效的方法声明,需要返回类型。

我只是想明白为什么这是我想要的和我错过的。

由于

9 个答案:

答案 0 :(得分:4)

没有索引4的元素。最后一个元素有索引3.

答案 1 :(得分:4)

您不能像上面的情况1那样直接初始化变量,您可以在构造函数中初始化block[][],如:

public Gold(){
    this.block[1][3] = new Block();
}

OR在块中:

Block[][] block = new Block[4][4];
{
      this.block[1][3] = new Block();
}

答案 2 :(得分:3)

你的声明必须在一段代码中。

尝试

public class Gold {
    Block[][] block = new Block[4][4];
    { // initializer block
        this.block[1][3] = new Block(); //1
    }

答案 3 :(得分:3)

这里有两个问题,你需要初始化范围内的任何对象。您必须拨打1号线in a constructor or in a function or with in a block (enclosed with in {and} )。在这里,您需要了解static blocknon-static blocks之间的区别。

您遇到的其他问题是this.block[1][4] = new Block();将抛出ArrayIndexOutofBounds异常,因为数组的长度为4,并且您正尝试在第5位插入和对象。

答案 4 :(得分:2)

我认为您应该将代码放在构造函数中:

public Gold(){
    this.block[1][4] = new Block();
}

在java类中,您可以定义变量或方法(包括构造函数),但不能在其中使用普通代码。

答案 5 :(得分:2)

您需要将代码包装在方法中,而不是在类体中。如果Gold类的初始化部分将其置于其构造函数中,如:

public class Gold {

    Block[][] block = new Block[4][4];

    public Gold() {
          this.block[1][4] = new Block();
    }

}

类主体仅允许变量声明和实例化,但不允许更改对象(您的数组)值等标准操作。

编辑:正如其他人指出的那样,索引4在大小为4的数组中不存在,只能访问从03的索引。< / p>

答案 6 :(得分:2)

this.block[1][4] = new Block(); //1

表达式不是字段初始化。它不能在方法体之外。

答案 7 :(得分:1)

这句话

this.block[1][4] = new Block(); //1

不能超出方法或初始化块。如果你想初始化数组,你必须在声明或方法内部(构造函数可能是一个好地方),或者你必须使用初始化块。

同时检查数组边界。在Java数组中有0个基于索引。

答案 8 :(得分:1)

代码this.block[1][4] = new Block()已编译但在运行时将失败:您的数组有4个元素,而java中的索引和所有类C语言从0开始,因此4个元素长数组的最大值为3。

你不能在java中的方法之外编写代码,所以如果你试试这个就会出现编译错误。