簡體   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