Forma más fácil de garantizar entero de entrada a través del Escáner?

Para un programa que estoy escribiendo, tengo que preguntarle a un usuario un número entero entre 1 y 8. He probado con varios (limpieza) formas de hacer esto, pero ninguno de ellos funcionó, así que me quedo con este:

    int x = 0;
    while (x < 1 || x > 8)
    {   
        System.out.print("Please enter integer  (1-8): ");

        try
        {
            x = Integer.parseInt(inputScanner.next());
        }
        catch(NumberFormatException e)
        {
            x = 0;
        }
    }

Donde inputScanner es un Escáner. Sin duda hay una mejor manera?

InformationsquelleAutor Logan Serman | 2009-01-22

7 Kommentare

  1. 4

    Escáner hace de las expresiones regulares, derecho? ¿Por qué no comprobar si coincide con «^[1-8]$» primero?

  2. 3

    El uso de la nextInt() es ya una mejora comparar simplemente utilizando el método next (). Y antes de eso, usted puede utilizar el hasNextInt() para evitar haing todo este montón de inútiles excepciones.

    Resultando en algo como esto:

    int x = 0;
    do {
      System.out.print("Please...");
      if(scanner.hasNextInt()) x = scanner.nextInt();
      else scanner.next();
    } while (x < 1 || x > 8);
    • Que se traduce en un bucle infinito si usted proporciona una cadena.
    • Aunque sé que su código es sintácticamente correcta, tener un si, a continuación, en una sola línea, sin llaves no es estándar. Sol: Nota: si las declaraciones de utilizar siempre las llaves {}. Evitar los siguientes propensa a errores de forma: si (condición) instrucción; //EVITAR! ESTO OMITE LAS LLAVES {}!
    • Y él también se omite el punto y coma después del while(), sin embargo, de alguna manera me las arreglé para entender su significado. 🙂
    • Pensé que un recorte-fue una de esas cosas que los niños ponen alrededor de su tobillo y saltó por encima de mientras que giraba en círculos?
    • He escuchado que el mismo razonamiento miles de veces en mi vida. Un montón de errores han sido introducidas por esa misma razón. Aunque es correcto que una pequeña pieza de código no debe ser tomado tan en serio, que en última instancia refleja sus prácticas. Es una cuestión de buenos hábitos.
    • Este sitio es acerca de aprender, no se trata de ego. Cuando la gente señale los errores que hago aquí, y puedo cometer errores, admito mis errores y seguir con la vida. Es mucho más difícil de romper un mal hábito que para crear un buen hábito desde el principio. Recordar el eslogan original para este sitio? 😉
    • codinghorror.com/blog/archives/001169.html
    • Ok, señor de la media. Así, la lectura de mi fragmento, hizo deducir que, IRL, todo mi código se pasa a través de un formateador al momento de guardar? En la que estoy trabajando mediante el TDD/BDD metodologías? Que me introdujo y garantiza las buenas prácticas de las que estamos hablando en mi empresa? Yo no lo creo.

  3. 2

    Tuve que hacer un gráfico de la interfaz de la calculadora (que sólo funciona con números Enteros), y el problema fue, que
    las Pruebas no permitir ninguna excepción se produce si la entrada no era
    Entero. Así que no podía usar

    try { int x = Integer.parseInt(input)} catch (Exception e) {dosomethingelse}

    Debido a que los programas de Java en general el tratamiento de una entrada a un JTextField como una Cadena
    He utilizado este:

    if (input.matches("[1-9][0-9]*"){ //String.matches() returns boolean
       goodforyou
    } else {
       dosomethingelse
    }
    
    //this checks if the input's (type String) character sequence matches
    //the given parameter. The [1-9] means that the first char is a Digit
    //between 1 and 9 (because the input should be an Integer can't be 0)
    //the * after [0-9] means that after the first char there can be 0 - infinity
    //characters between digits 0-9

    espero que esta ayuda 🙂

  4. 1

    Usted podría intentar algo como esto:

    Scanner cin = new Scanner(System.in);
    int s = 0;    
    boolean v = false;
    while(!v){
        System.out.print("Input an integer >= 1: ");
    
        try {    
            s = cin.nextInt();
            if(s >= 1) v = true;
            else System.out.println("Please input an integer value >= 1.");
        } 
        catch(InputMismatchException e) {
            System.out.println("Caught: InputMismatchException -- Please input an integer value >= 1. ");
            cin.next();
        }
    }
  5. 0
    String input;
    int number;
    
    while (inputScanner.hasNextLine())
    {
        input = inputScanner.nextLine();
    
        if (input.equals("quit")) { System.exit(0); }
        else
        {
            //If you don't want to put your code in here, make an event handler
            //that gets called from this spot with the input passed in
            try
            {
                number = Integer.parseInt(input);
                if ((number < 1) || (number > 8))
                { System.out.print("Please choose 1-8: "); }
                else { /* Do stuff */ }
            }
            catch (NumberFormatException e) { number = 0; }
        }
    }

    Siempre me gusta tirar de la cadena completa de modo que usted puede estar seguro de que el usuario empuja el botón Enter. Si usted sólo tiene que utilizar inputScanner.nextInt() puedes poner dos ints en una línea y que se tire en una, luego la otra.

  6. 0

    Ejemplo de código:

    int x;
    Scanner in = new Scanner(System.in);
    System.out.println("Enter integer value: ");
    x = in.nextInt();

    Una matriz también puede ser utilizado para almacenar el número entero.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea