Java

boa noite estou tentando fazer esta questao:.
Escreva um programa que armazene em um vetor os nomes dos meses do ano, em
seguida peça ao usuário que digite um valor inteiro. Após isso, mostrar o nome do mês
correspondente ao número digitado.
O programa deve finalizar quando for digitado o valor zero.
Deve tratar por meio de exceções a digitação inválida e o índice do mês inválido.

import java.util.Scanner;
public class Meses01 {

public static void main(String[] args) {
   
}
Scanner entrada= new Scanner(System.in);
   int cont =0;    

String meses[] = {“Janeiro”, “Fevereiro”, “Março”, “Abril”,
“Maio”, “Junho”, “Julho”, “Agosto”,“Setembro”,
“Outubro”, “Novembro”, “Dezembro” };

for (int i = 1; i <= 12; i++) {
System.out.print("Digite o "+i+" numero: 0");

}
}
apartir dai não consegui uma ideia de como continuar…

Uma forma que consegui resolver foi:

import java.util.Scanner;
public class Meses01 {
    public static void main(String args[]) {

    int opcao, cont = 1;
    Scanner entrada= new Scanner(System.in);
    String meses[] = {"Obrigado por utilizar.", "Janeiro", "Fevereiro", "Março", "Abril",
    "Maio", "Junho", "Julho", "Agosto","Setembro",
    "Outubro", "Novembro", "Dezembro"};
    
    do {
    System.out.print("Digite o " + cont + "º numero: ");
    opcao = entrada.nextInt();
    
    try{
        
    if(opcao != 0) {
        System.out.println("O mês selecionado foi: " + meses[opcao]);
    }else {
        System.out.println(meses[0]);
    }
    
    cont++;
    }catch(ArrayIndexOutOfBoundsException erro) {
        System.out.println("Número inválido. Insira um número entre 1 e 12.");
    }
    }while(opcao != 0);
}

}

1 curtida

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.