IndexOutOfRangeException: Can’t figure out why index out of bound

So, I have a list of Upgrade systems for my game but it has a bug on it when I press upgrade for a second time the index out of range then pressed for the third times the index out of range gone. this whole script.

void Start() {     newSelectedIndex = previousSelectedIndex = PlayerPrefs.GetInt("currentPlayer");     btn = Select_Player[newSelectedIndex].GetComponent<Button>();     btn.interactable = false;      Coins = M_CoinManager.instance.Coins;     for (int i = 0; i < Select_Player.Length; i++)     {         priceText[i].text = Cost_Player[i].ToString();         value_player[i] = "" + i;         Select_Player[i].SetActive(false);         buyPlayer[i] = PlayerPrefs.GetInt(value_player[i]);     }     //if(PlayerPrefs.HasKey("currentPlayer")){     selectedVehicleIndex = PlayerPrefs.GetInt("currentPlayer");         theVehicles[selectedVehicleIndex].SetActive(true);     VehicleInfo();     UpgradeButtonStatus(); }  // Update is called once per frame void Update() {     for (int i = 0; i < Select_Player.Length; i++)     {         buyPlayer[i] = PlayerPrefs.GetInt(value_player[i]);         if (i == buyPlayer[i])         {             Select_Player[i].SetActive(true);             upgradeBtn[i].interactable = true;             UpgradeButtonStatus();          }         else         {             upgradeBtn[i].interactable = false;         }     } }  public void BuyCharact(int id) {     M_SoundManager.instance.playUIsfx();     if (Cost_Player[id] <= Coins)     {         M_CoinManager.instance.AddCoins(-Cost_Player[id]);         PlayerPrefs.SetInt(value_player[id], id);      }     else     {         _CoinShake.DoShake();         Debug.Log("Does have enough coin");     } }  public void Reset() {     for (int i = 0; i < Select_Player.Length; i++)     {         PlayerPrefs.SetInt(value_player[i], 0);     } }  public void Select(int id) {     previousSelectedIndex = newSelectedIndex;     newSelectedIndex = id;     newSelectedIndex = selectedVehicleIndex;      PlayerPrefs.SetInt("currentPlayer", newSelectedIndex);     Button newbtn = Select_Player[previousSelectedIndex].GetComponent<Button>();     btn = Select_Player[newSelectedIndex].GetComponent<Button>();     btn.interactable = false;     newbtn.interactable = true;     M_SoundManager.instance.playUIsfx();     Debug.Log("Selected TypeCar" + newSelectedIndex); }  public void nextVehicle() {     M_SoundManager.instance.playUIsfx();     theVehicles[selectedVehicleIndex].SetActive(false);     selectedVehicleIndex = (selectedVehicleIndex + 1) % theVehicles.Length;     theVehicles[selectedVehicleIndex].SetActive(true);     VehicleInfo();     UpgradeButtonStatus(); }  public void PreviousVehicle() {     M_SoundManager.instance.playUIsfx();     theVehicles[selectedVehicleIndex].SetActive(false);     selectedVehicleIndex--;     if (selectedVehicleIndex < 0)     {         selectedVehicleIndex += theVehicles.Length;     }     theVehicles[selectedVehicleIndex].SetActive(true);     VehicleInfo();     UpgradeButtonStatus(); }  public void VehicleInfo() {     currLevel = _VehicleStats[0].carItem[selectedVehicleIndex].unlockedLevel;     levelText[selectedVehicleIndex].text = "Level: " + (currLevel + 1);     powerText[selectedVehicleIndex].text = "Power: " + _VehicleStats[0].carItem[selectedVehicleIndex].vehicleLevel[currLevel].motorPower;     brakeText[selectedVehicleIndex].text = "Brake: " + _VehicleStats[0].carItem[selectedVehicleIndex].vehicleLevel[currLevel].brakePower;           Debug.Log(selectedVehicleIndex); }  public void upgradeMethod() {     nextLevelIndex = _VehicleStats[0].carItem[selectedVehicleIndex].unlockedLevel + 1;     if (Coins >= _VehicleStats[0].carItem[selectedVehicleIndex].vehicleLevel[nextLevelIndex].unlockCost)     {         Coins -= _VehicleStats[0].carItem[selectedVehicleIndex].vehicleLevel[nextLevelIndex].unlockCost;         _VehicleStats[0].carItem[selectedVehicleIndex].unlockedLevel++;          if (_VehicleStats[0].carItem[selectedVehicleIndex].unlockedLevel < _VehicleStats[0].carItem[selectedVehicleIndex].vehicleLevel.Length - 1)         {             upgradeBtnText[selectedVehicleIndex].text = "Upgrade Cost :" + _VehicleStats[0].carItem[selectedVehicleIndex].vehicleLevel[nextLevelIndex + 1].unlockCost;         }         else         {             upgradeBtn[selectedVehicleIndex].interactable = false;             upgradeBtnText[selectedVehicleIndex].text = "Max Level";         }         VehicleInfo();     }  }  private void UpgradeButtonStatus() {     if (_VehicleStats[0].carItem[selectedVehicleIndex].unlockedLevel < _VehicleStats[0].carItem[selectedVehicleIndex].vehicleLevel.Length - 1)     {         upgradeBtn[selectedVehicleIndex].interactable = true;         nextLevelIndex = _VehicleStats[0].carItem[selectedVehicleIndex].unlockedLevel + 1;         upgradeBtnText[selectedVehicleIndex].text = "Upgrade Cost :" + _VehicleStats[0].carItem[selectedVehicleIndex].vehicleLevel[nextLevelIndex + 1].unlockCost;     }     else     {         upgradeBtn[selectedVehicleIndex].interactable = false;         upgradeBtnText[selectedVehicleIndex].text = "Max Level";     } } 

and the error reference to this line :

private void UpgradeButtonStatus() {     if (_VehicleStats[0].carItem[selectedVehicleIndex].unlockedLevel < _VehicleStats[0].carItem[selectedVehicleIndex].vehicleLevel.Length - 1)     {         upgradeBtn[selectedVehicleIndex].interactable = true;         nextLevelIndex = _VehicleStats[0].carItem[selectedVehicleIndex].unlockedLevel + 1;         upgradeBtnText[selectedVehicleIndex].text = "Upgrade Cost :" + _VehicleStats[0].carItem[selectedVehicleIndex].vehicleLevel[nextLevelIndex + 1].unlockCost;     }     else     {         upgradeBtn[selectedVehicleIndex].interactable = false;         upgradeBtnText[selectedVehicleIndex].text = "Max Level";     }  } 

as you can see on the update that’s what I mean. after I press upgrade for the third times the error stopped.

and this from the inspector Inspector