Looping Infinito ao usar try-catch

Caros, boa noite.

Estou aprendendo a desenvolver Java e num determinado exercício ocorreu um looping infinito e eu não entendi exatamente o motivo.

@SuppressWarnings("empty-statement")
public static void main(String[] args) {
	// TODO code application logic here
	Scanner teclado = new Scanner (System.in);
	
	int opc = 0;
	int compv = 0;
	int userv = 0;
	int emp = 0;
	int usuario; 
	
	System.out.println("*****Jokey Poh!*****" + "\n");
	
	do {
		System.out.println("Informe um número de acordo com a opção desejada" + "\n");
		System.out.println("Pedra = 0, papel = 1, tesoura = 2" + "\n");
		
		try {
			double aleatorio = Math.random();
			int computador = (int) (0 + aleatorio * (3 - 0));
			
			if (computador == 3) {
				computador -= 1;
			}
			
			usuario = teclado.nextInt();
			
			switch (usuario) {
				case 0: 
				case 1:
				case 2:
					System.out.println("*****Resultado*****" + "\n");
					System.out.println("Ecolha do Computador: " + computador);
					System.out.println("Escolha do Usuário: " + usuario);

					if (usuario == 0 && computador == 1) {
						System.out.println("O Computador é o vencedor." + "\n");
						compv += 1;
					}

					if (computador == 0 && usuario == 1) {
						System.out.println("Parabens ! Você venceu! " + "\n");
						userv += 1;
					}
					
					if (computador == 0 && usuario == 2) {
						System.out.println("O Computador é o vencedor. "+ "\n");
						compv += 1;
					}
					
					if (usuario == 0 && computador == 2) {
						System.out.println("Parabens ! Você venceu! " + "\n");
						userv += 1;
					}
					
					if (usuario == 1 && computador == 2) {
						System.out.println("O Computador é o vencedor. " + "\n");
						compv += 1;
					}
					
					if (computador == 1 && usuario == 2) {
						System.out.println("Parabens ! Você venceu! " + "\n");
						userv += 1;
					}
					
					if (computador == 1 && usuario == 1) {
						System.out.println("Empatou!" + "\n");
						emp += 1;
					}

					if (computador == 2 && usuario == 2) {
						System.out.println("Empatou!" + "\n");
						emp += 1;
					}
					
					if (computador == 0 && usuario == 0) {
						System.out.println("Empatou!" + "\n" );
						emp ++;
					}
                    
					break;
				default: 
					System.out.println("Informe uma opção Valida" + "\n");
					break;
			}
			
			System.out.println("*****PLACAR*****");
			System.out.println("Computador: " + compv);
			System.out.println("Você: " + userv);
			System.out.println("Empates: " + emp);
			System.out.println("\n");
			
			System.out.println("Deseja Jogar mais uma vez ? Então Digite '1' !");
			opc = teclado.nextInt();
		} catch (java.util.InputMismatchException e) {
			System.out.println("Informe um valor numérico");
		}
	} while (opc == 1);
}
}

Como podem ver, eu criei um “joguinho” para treinar looping, try cath, if, etc.É mais para praticar mesmo, mas o lopping não para sempre que executo e ocorre a captura de uma exceção. Exemplo: Onde pede para eu digitar uma dos três números, caso eu digite uma letra ocorre um lopping, mas caso eu aperte um número invalido o looping não ocorre.

Poderiam me ajudar?

Antes de partir pro código, uma breve correção:

O nome do jogo, no Brasil, é corretamente escrito como Jokempô, uma vez que é o “aportuguesado” do nipônico Janken-pon.


Olá, @grscarvalho.

Nesses casos, sempre poste junto com o tópico a exceção. Formate-a para que possamos identificar mais facilmente.

O que acontece é o seguinte:

Quando você digita um número inválido, o “PLACAR” é exibido, mas quando se digita uma letra o placar não é. Isso ocorre porque ao digitar uma letra num Scanner que espera um int, uma InputMismatchException é lançada. Mas quando você digita um número errado, não é uma Exception e sim uma opção inválida.

Uma opção inválida não joga Exception, portanto, o fluxo de código continua normalmente, com o placar sendo montado e exibido.