為數組變數生成的公共視圖 getter 函式拋出錯誤
contract NumberList { uint256[] public bigNumberList; }
bigNumberList
在數組為空時嘗試呼叫關聯的 getter 函式時會產生錯誤。例如bigNumberList(0)
生成錯誤。但是,一旦我向數組中添加了一個數字,我就可以毫無問題地呼叫 getter 函式。從混音錯誤看起來像這樣:
呼叫 NumberList.bigNumberList CALL
$$ call $$from: 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4to: NumberList.bigNumberList(uint256)data: 0x35b…00000 from 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4 to NumberList.bigNumberList(uint256) 0xDA0bab807633f07f013f94DD0E6A4F96F8742B53 execution cost 23744 gas (Cost only applies when called by a contract) input 0x35b…00000 decoded input { “uint256”:“0”}解碼輸出{“0”:“uint256:0”}日誌 $$ $$ 呼叫 NumberList.bigNumberList 出錯:VM 錯誤:還原。 revert 事務已恢復到初始狀態。注意:如果您發送值並且您發送的值應該小於您目前的餘額,則呼叫的函式應該是應付的。調試事務以獲取更多資訊。
如您所見,上面的解碼輸出實際上是正確的,但我目前不明白為什麼呼叫該函式會產生錯誤?
您不能訪問數組中的無效索引。
如果
bigNumberList
為空,則每個索引的呼叫numberList.methods.bigNumberList(index)
都將失敗。
您可以定義一個返回數組長度的函式
function getBigNumberListLength() public view returns(uint){ return bigNumberList.length }
如果需要與數組互動,可以先獲取數組的長度,然後根據長度,可以使用有效的索引