[英]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.