[英]Can someone explain to me why I'm having this error?
美好的一天,
我有一个问题,在我的代码中,哪个声明在函数外部有错误。
片段是:
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的元素。最后一个元素的索引为3。
您不能像在情况1中那样直接初始化变量,可以在构造函数中初始化block[][]
,例如:
public Gold(){
this.block[1][3] = new Block();
}
或在块中:
Block[][] block = new Block[4][4];
{
this.block[1][3] = new Block();
}
您有一个必须在代码块中的语句。
尝试
public class Gold {
Block[][] block = new Block[4][4];
{ // initializer block
this.block[1][3] = new Block(); //1
}
这里有两个问题,您需要初始化作用域中的任何对象。 或者你在呼叫的号码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();
另一个问题是this.block[1][4] = new Block();
将抛出ArrayIndexOutofBounds
异常,因为数组的长度为4,并且您尝试在第5位插入和对象。
我认为您应该将代码放在构造函数中:
public Gold(){
this.block[1][4] = new Block();
}
在Java类中,您可以定义变量或方法(包括构造函数),但不能在其中使用普通代码。
您需要将代码包装在方法中,而不是在类主体中。 如果它是Gold
类初始化的一部分,则将其放入其构造函数中,例如:
public class Gold {
Block[][] block = new Block[4][4];
public Gold() {
this.block[1][4] = new Block();
}
}
类主体仅允许变量声明和实例化,而不允许诸如更改对象(数组)值的标准操作。
编辑:如其他指出的那样,索引4
在大小为4
的数组中不存在,只能访问0
到3
索引。
this.block[1][4] = new Block(); //1
是一个表达式,不是字段初始化。 它不能在方法主体之外。
这个句子
this.block[1][4] = new Block(); //1
不能超出方法或初始化块的范围。 如果要初始化数组,则必须在声明中或方法内部(构造函数可能是个好地方)进行初始化,或者必须使用Initialization块。
还要检查数组范围。 在Java中,数组具有从0开始的索引。
代码this.block[1][4] = new Block()
已编译,但将在运行时失败:您的数组有4个元素,而Java中的索引和所有类似C的语言均从0开始,因此最大值为4元素长数组为3。
而且您不能在Java方法外部编写代码,因此,如果尝试执行此操作,则会出现编译错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.