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.

¿Fue útil?

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(): Devoluciones true Si el siguiente token en la entrada de este escáner puede interpretarse como un valor int en el radix predeterminado usando el nextInt() 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() devoluciones 42; El escáner está ahora en justo antes el primero [enter].
  • hasNextInt() Es falso, nextLine() Devuelve una cadena vacía, una segunda nextLine() devoluciones "too many!"; El escáner está ahora en justo después de el segundo [enter].
  • hasNextInt() es verdad, nextInt() devoluciones 0; 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top