Bom, eu mudaria algumas coisas:
Scanner entrada = new Scanner(System.in);
String meses[] = {"Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"};
String erro = "Número inválido. Insira um número entre 1 e 12.";
int cont = 1;
while (true) {
System.out.print("Digite o " + cont + "º numero: ");
try {
int opcao = Integer.parseInt(entrada.nextLine());
if (opcao == 0) {
System.out.println("Encerrando"); // coloque a mensagem que quiser aqui
break; // sai do while
} else if (opcao < 1 || opcao > 12) { // mês inválido
System.out.println(erro);
} else { // o mês estará no índice "opcao - 1"
System.out.println("O mês selecionado foi: " + meses[opcao - 1]);
}
cont++;
} catch (NumberFormatException e) { // não foi digitado um número
System.out.println(erro);
}
}
Eu acho melhor criar um array só com os meses, e aí você pega o valor que foi digitado e subtrai 1. Mas antes eu verifico se o valor do mês é válido, eu acho isso melhor do que tentar acessar uma posição inexistente e capturar o ArrayIndexOutOfBoundsException
- sei que o exercício “exige que use exceção”, mas eu acho ruim usar exceções como controle de fluxo: se já dá pra saber antes que a posição é inválida, pra que forçar que o erro aconteça?
A única exceção que eu capturo é NumberFormatException
, pois se o usuário digitar algo que não é um número (como por exemplo “abc”, ou “!@$”), dá erro. Nesse caso não tem como verificar antes (como foi feito com o índice do array), já que só tentando converter para número é que saberemos se a conversão dará certo. E a linguagem não oferece outro mecanismo (a não ser que a gente analise manualmente, o que seria um retrabalho desnecessário).
E em casos assim eu prefiro usar um loop infinito (while (true)
) e interrompê-lo com break
. Sei lá porque muita gente “não gosta” de break
, mas enfim, pra mim fica mais claro. Sem contar que no seu código você coloca a mensagem de encerramento dentro do if (opcao == 0)
, e no while
tem que repetir a mesma condição para saber que o loop se encerrou. E se por acaso essa condição mudar (por exemplo, qualquer valor menor ou igual a zero encerra), você teria que alterar em dois lugares. No meu código, só precisaria mudar em um único ponto. Isso é um exemplo bem simples de DRY (Don’t Repeat Yourself), um conceito bem útil, aliás.