verificación de entrada de usuario solo

Estoy tratando de que mi entrada de usuario no bloquee mi programa al restringir lo que el usuario puede ingresar, como:

solo siendo un intestar entre 1-30

El código que he escrito funciona solo hasta cierto punto. Si ingresa algo que no es un int, lo revisará y le pedirá que ingrese nuevamente. Entonces otra vez si sigues escribiendo cualquier cosa menos un int. Tengo otro bucle while si escribe un int, y si está fuera de la zona 1-30, le pedirá al usuario que ingrese nuevamente. Sin embargo, después de eso, si el usuario escribe otro "cualquier cosa menos un int", el programa se bloqueará. He intentado combinar ambossc.hasnextint() y la verificación de entrada entre 1-30 condición pero si puse elsc.nextint() antes desc.hasnextint() y el usuario ingresa cualquier cosa que no sea un int, el programa falla. Si lo pongo después del ciclo de condiciones, la entrada de usuario no se declarará.

int choose;
System.out.print("type an integer: ");
Scanner sc=new Scanner(System.in);

while (!sc.hasNextInt() ) { 
    System.out.println("only integers!: "); 
    sc.next(); // discard 
} 

choose=sc.nextInt();

while (choose<=0 || choose>30)
{
    System.out.print("no, 1-30: ");
    choose=sc.nextInt();
}
sc.close();

Respuestas a la pregunta(4)

Su respuesta a la pregunta