Você invoca o método nextByte() antes.
Sempre que você invocar qualquer método next, você vai acabar deixando “lixo” no stream de entrada.
É este lixo que é lido.
Exemplo:
Vamos supor que você precise ler idade e nome de uma pessoa.
System.out.println(“Idade”);
int idade = sc.nextInt();//Usuário digita 45 e pressiona enter que é lido como \n
System.out.println(“Nome”);
String nome = sc.nextLine();//Não espera digitar e pula para a próxima linha
O código acima exemplifica o que acontece. Quando você invoca o nextInt() (ou nextFloat() ou nextDouble() ou nextByte() ou nextLong(), etc), lê apenas a parte que vem antes do “\n”, que é o sinal que o Scanner espera para capturar o valor que lhe cabe.
Neste cenário, o valor inteiro (ou byte, ou float, ou long ou double, etc) é lido sem problemas.
Porém, esta leitura só retira do stream a parte numérica, deixando o \n lá.
Quando o método nextLine() é invocado, o mesmo encontra um “\n” lá dando bobeira, o captura e não se comporta como esperado.
Assim sendo, a única forma de resolver o problema é sempre utilizar o método nextLine().
Ok, ele só lê Strings!
Aí entram as classes wrappers, que são classes que representam os oito tipos primitivos do java
boolean -> Boolean
byte -> Byte
short -> Short
int -> Integer
char -> Character
float -> Float
long -> Long
double -> Double
Cada qual possui métodos responsáveis por transformar uma String em um tipo primitivo correspondente ou um objeto daquela classe.
Exemplo:
System.out.println("Idade");
String sIdade = sc.nextLine();//O usuário digita 45 e pressiona a tecla enter, \n
int idade = Integer.valueOf(sIdade);//pega a parte inteira e transforma no int
Entendeu?