¿Cómo evito que un escáner arroje excepciones cuando se ingresa el tipo incorrecto?
-
21-09-2019 - |
Pregunta
Aquí hay algún código de muestra:
import java.util.Scanner;
class In
{
public static void main (String[]arg)
{
Scanner in = new Scanner (System.in) ;
System.out.println ("how many are invading?") ;
int a = in.nextInt() ;
System.out.println (a) ;
}
}
Si ejecuto el programa y le doy un int
me gusta 4
, entonces todo va bien.
Por otro lado, si respondo too many
No se ríe de mi broma divertida. En cambio, obtengo esto (como se esperaba):
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:819)
at java.util.Scanner.next(Scanner.java:1431)
at java.util.Scanner.nextInt(Scanner.java:2040)
at java.util.Scanner.nextInt(Scanner.java:2000)
at In.main(In.java:9)
¿Hay alguna manera de hacer que ignore las entradas que no son ints o replican con "cuántos están invasando?" Me gustaría saber cómo hacer ambos.
Solución
Puedes usar uno de los muchos hasNext*
métodos que Scanner
tiene para la validación previa.
if (in.hasNextInt()) {
int a = in.nextInt() ;
System.out.println(a);
} else {
System.out.println("Sorry, couldn't understand you!");
}
Esto previene InputMismatchException
incluso de ser arrojado, porque siempre te aseguras de que VOLUNTAD coincide antes de leerlo.
java.util.Scanner API
boolean hasNextInt()
: Devolucionestrue
Si el siguiente token en la entrada de este escáner puede interpretarse como un valor int en el radix predeterminado usando elnextInt()
método. El escáner no avanza más allá de ninguna entrada.String nextLine()
: Avanza este escáner más allá de la línea actual y devuelve la entrada que fue omitida.
Tenga en cuenta las secciones en negrita. hasNextInt()
no avanza más allá de ninguna entrada. Si regresa true
, puede avanzar el escáner llamando nextInt()
, que no arrojará un InputMismatchException
.
Si regresa false
, entonces necesitas saltarte la "basura". La forma más fácil de hacer esto es simplemente llamando nextLine()
, probablemente dos veces pero al menos una vez.
Por qué es posible que necesite hacer nextLine()
Dos veces es lo siguiente: Suponga que esta es la entrada ingresada:
42[enter]
too many![enter]
0[enter]
Digamos que el escáner está al comienzo de esa entrada.
hasNextInt()
es verdad,nextInt()
devoluciones42
; El escáner está ahora en justo antes el primero[enter]
.hasNextInt()
Es falso,nextLine()
Devuelve una cadena vacía, una segundanextLine()
devoluciones"too many!"
; El escáner está ahora en justo después de el segundo[enter]
.hasNextInt()
es verdad,nextInt()
devoluciones0
; El escáner está ahora en justo antes El tercero[enter]
.
Aquí hay un ejemplo de armar algunas de estas cosas. Puedes experimentar con él para estudiar cómo Scanner
obras.
Scanner in = new Scanner (System.in) ;
System.out.println("Age?");
while (!in.hasNextInt()) {
in.next(); // What happens if you use nextLine() instead?
}
int age = in.nextInt();
in.nextLine(); // What happens if you remove this statement?
System.out.println("Name?");
String name = in.nextLine();
System.out.format("[%s] is %d years old", name, age);
Digamos que la entrada es:
He is probably close to 100 now...[enter]
Elvis, of course[enter]
Entonces la última línea de la salida es:
[Elvis, of course] is 100 years old
Otros consejos
En general, realmente no me gusta usar la misma llamada de biblioteca para leer y analizar. Las bibliotecas de idiomas parecen ser muy inflexibles y, a menudo, no pueden doblarse a su voluntad.
El primer paso que extrae datos del sistema. Si la conversión falla, excelente, imprima su error y continúe.
Cuando envuelve su transmisión con algo que puede lanzar una excepción, se vuelve un poco confuso en qué estado deja todo el desastre.
Siempre es un beneficio para tener Su aplicación arroja un error cuando se produce un error opuesto a las formas de mantener por suceder.
Una alternativa es envolver el código dentro de un try {...}
catch {...}
bloquear para InputMismatchException
. Es posible que también desee envolver el código dentro de un while
bucle para tener el Scanner
Siga solicitando hasta que se cumpla una condición específica.