繁体   English   中英

有人可以向我解释为什么我有此错误吗?

[英]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 blocknon-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的数组中不存在,只能访问03索引。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM