Qual expressão lógica usar no loop while

Caros amigos, gostaria de pedir ajuda nessa, sou apenas um aprendiz em JAVA.
Estou construindo um programa que leia números de fichas digitadas pelo usuário e
organize essas fichas de maneira crescente.

Para isso, iniciei um Scanner e um ArrayList(), para ler os números digitados e
armazenar na lista.
Pensei em fazer um loop while para ler números digitados pelo usuário até que ele digite
uma string, aí o loop while seria finalizado e eu exibo as informações que quero.

Que expressão usar no loop while para que isso aconteça ?

Segue o código até agora:

Eu faria assim:

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

class Teste {
    public static void main(String... args) {
        Scanner scan = new Scanner(System.in);
        List<Integer> numbers = new ArrayList<>();

        while (true) {
            try {
                System.out.println("Insira o número:");
                numbers.add(Integer.parseInt(scan.nextLine()));
            } catch (NumberFormatException e) {
                break;
            }
        }

        System.out.println("Estes foram os números digitados:");

        for (int i : numbers)
            System.out.println(i);

        scan.close();
    }
}

A idéia é a seguinte:

Eu usei o nextLine() para ler o input do usuário como uma String ao invés de usar o nextInt(), porque nos meus testes deu menos problemas e porque depois eu uso o parseInt() pra converter está String em um numéro inteiro.

O negócio é que se vc passa pro parseInt() uma String que só contém números, ele faz a conversão normalmente, porém, se passar uma String contendo letras, ele lança uma exceção e cai no bloco catch onde eu uso o break pra encerrar o while.

A linha while(true) faz com que o loop seja executado indefinidamente, no caso, até o usuário digitar um letra qualquer.

Eu declarei a variável numberes como uma List ao invés de ArrayList apenas por uma questão de boas práticas, mas vc pode continuar declarando-a como ArrayList sem problemas.

Uma coisa a se ter em mente é que vc não pode usar tipos primitivos como Type Arguments (o tipo usado em < e >). Vc pode umar apenas Tipos Referencia.

Ou seja, sempre que quiser uma lista de inteiros, vc não pode usar List<int> e sim List<Integer>. Uma lista de characteres ficaria assim List<Character> ao invés de List<char>.

Muito obrigado pela ajuda!!

1 curtida