Desde el teclado (por ejemplo), se pulsan teclas. Las teclas tienen un código, que en definitiva son un BYTE... Tu no puedes delimitar lo que el usuario digite, porque no hay ninguna funcionalidad que 'desactivara' (por ejemplo) las teclas del teclado, para solo estár activas las que a tu programa le intrese.
Puedes crear tus propias funciones o usar las que existen.
Como son las funciones 'HashNext... Que en definitiva avisa si el siguiente token es del (puede resolverse en el) tipo deseado...
...o incluso hacer uso de funciones más primitivas como son: Parse... (Integer.parseInt) y TryParse..., convierten a... ó intentan convertir a...
los toquens que el usuario introdujo.
Así, por ejemplo, en vez de tomar un valor que no pudiera ser interpretado como un integer (sin un tratamiento más explícito), sería preguntarlo:
Scaner s = nuevo Scaner(in)
Si s.hashNextInt entonces
int i= s.nextInt
Sino
mensaje 'esperamos un valor numérico para...'
fin si
Te aconsejo ir al sitio de Sun, y ojees con cierta profundidad el objeto Scanner...
https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html