0

再会,

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

片段是:

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 没有错误。但是,不在函数内部的第一个代码显示错误:

非法启动类型

找不到标志

']' 预期的

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

我只是想了解为什么会发生这种情况以及我缺少什么。

谢谢

4

9 回答 9

4

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

于 2012-08-22T09:08:24.113 回答
4

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

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

或在块中:

Block[][] block = new Block[4][4];
{
      this.block[1][3] = new Block();
}
于 2012-08-22T09:08:37.767 回答
3

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

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

于 2012-08-22T09:12:48.340 回答
3

您有一个必须在代码块中的语句。

尝试

public class Gold {
    Block[][] block = new Block[4][4];
    { // initializer block
        this.block[1][3] = new Block(); //1
    }
于 2012-08-22T09:08:31.980 回答
2

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

public class Gold {

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

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

}

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

编辑:正如其他人指出的那样,索引4不存在于 size 的数组中4,只能访问0to的索引3

于 2012-08-22T09:09:21.093 回答
2
this.block[1][4] = new Block(); //1

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

于 2012-08-22T09:10:25.130 回答
2

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

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

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

于 2012-08-22T09:07:38.203 回答
1

这个句子

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

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

还要检查数组边界。在 Java 中,数组具有基于 0 的索引。

于 2012-08-22T09:08:54.350 回答
1

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

而且你不能在java中的方法之外编写代码,所以如果你尝试这个,你会得到编译错误。

于 2012-08-22T09:09:31.570 回答