美好的一天,
我有一个问题,在我的代码中,一个声明在函数外面有错误。
该片段是:
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没有错误。但是,不在函数内部的第一个代码显示错误:
非法启动类型
找不到符号
']'预计
无效的方法声明,需要返回类型。
我只是想明白为什么这是我想要的和我错过的。
由于
答案 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 block
和non-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
的数组中不存在,只能访问从0
到3
的索引。< / 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中的方法之外编写代码,所以如果你试试这个就会出现编译错误。