lcd making random things

im trying to make an lcd menu with button controls. whenever i try to raise the current screen number to change screens it [offensive phrase removed] out.

Here is my code:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

const int  en = 2, rw = 1, rs = 0, d4 = 4, d5 = 5, d6 = 6, d7 = 7, bl = 3;
const int i2c_addr = 0x3F;
LiquidCrystal_I2C lcd(i2c_addr, en, rw, rs, d4, d5, d6, d7, bl, POSITIVE);

char Show[5] = {"|/-"};
uint8_t SpecialChar [8]= {0x00, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x00};

String testing[] = {"testing1","testing2","testing3","testing4","testing5","testing6","testing7","testing8"};

int down = 8;

void setup() {
  Serial.begin(9600);
  
  pinMode(down, INPUT);
  digitalWrite(down,HIGH);
  
  lcd.begin(16,2);

  lcd.setCursor(0,0);
  lcd.print("Loading Dog");

  delay(1000);

  lcd.setCursor(0,1);
  lcd.print("|");
  delay(1000);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Loading Dog");
  lcd.setCursor(0,1);
  lcd.print(char(0));
  delay(1000);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Loading Dog");
  lcd.setCursor(0,1);
  lcd.print("-");
  delay(1000);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Loading Dog");
  lcd.setCursor(0,1);
  lcd.print("/");
  delay(1000);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Loading Dog");
  lcd.setCursor(0,1);
  lcd.print("|");
  delay(1000);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Loading Dog");
  delay(1000);
  lcd.clear();
  delay(1000);
  lcd.setCursor(0,0);
  lcd.print(testing[0]);
}

int i = 0;

void loop() {
 int ButtonDown = digitalRead(down);
   
  if (ButtonDown == LOW){ //going to next screen
    i++;
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(testing[i]);
  }
}

Here is my wiring

Screenshot_3.png

What stops i getting larger and larger when you have the button held down?
Hint: Nothing....

What happens when i is 8 or more?
Hint: Your array "testing" is only 8 elements long, numbered 0 through 7.

so basically i need a way of detecting when i get to the end of the array to stop it?

i tried to do what i think you said but it still didnt work
(Edit): never mind i just have to put a delay in between isButtonBacckUP

int i = 0;
bool isButtonBackUp = true;

void loop() {
 int ButtonDown = digitalRead(down);
   
  if (ButtonDown == LOW && isButtonBackUp == true){
    i++;
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(testing[i]);
    delay(200);
    isButtonBackUp = false;
  }else if(ButtonBackUp == HIGH){
    isButtonBackUp = true;
  }
}