usar scanner para mejor leer hacer funciona escaner elegir cómo como codigos clases casero autos automotriz java validation java.util.scanner

java - mejor - Cómo usar Scanner para aceptar solo int válido como entrada



el mejor scanner automotriz para pc (6)

Estoy tratando de hacer un programa pequeño más robusto y necesito ayuda con eso.

Scanner kb = new Scanner(System.in); int num1; int num2 = 0; System.out.print("Enter number 1: "); num1 = kb.nextInt(); while(num2 < num1) { System.out.print("Enter number 2: "); num2 = kb.nextInt(); }

  1. El número 2 tiene que ser mayor que el número 1

  2. También quiero que el programa compruebe automáticamente e ignore si el usuario ingresa un carácter en lugar de un número. Porque ahora mismo cuando un usuario ingresa por ejemplo r lugar de un número, el programa simplemente sale.


  1. la condición num2 <num1 debe ser num2 <= num1 si num2 tiene que ser mayor que num1
  2. sin saber cuál es el objeto kb, leería un String y luego try Integer.parseInt() y si no catch una excepción, entonces es un número, si lo hace, lea uno nuevo, tal vez estableciendo num2 a Integer.MIN_VALUE y usando el mismo tipo de lógica en su ejemplo.

Esto debería funcionar:

import java.util.Scanner; public class Test { public static void main(String... args) throws Throwable { Scanner kb = new Scanner(System.in); int num1; System.out.print("Enter number 1: "); while (true) try { num1 = Integer.parseInt(kb.nextLine()); break; } catch (NumberFormatException nfe) { System.out.print("Try again: "); } int num2; do { System.out.print("Enter number 2: "); while (true) try { num2 = Integer.parseInt(kb.nextLine()); break; } catch (NumberFormatException nfe) { System.out.print("Try again: "); } } while (num2 < num1); } }



Prueba esto:

public static void main(String[] args) { Pattern p = Pattern.compile("^//d+$"); Scanner kb = new Scanner(System.in); int num1; int num2 = 0; String temp; Matcher numberMatcher; System.out.print("Enter number 1: "); try { num1 = kb.nextInt(); } catch (java.util.InputMismatchException e) { System.out.println("Invalid Input"); // return; } while(num2<num1) { System.out.print("Enter number 2: "); temp = kb.next(); numberMatcher = p.matcher(temp); if (numberMatcher.matches()) { num2 = Integer.parseInt(temp); } else { System.out.println("Invalid Number"); } } }

También podría intentar analizar la cadena en un int , pero generalmente las personas intentan evitar lanzar excepciones.

Lo que he hecho es que he definido una expresión regular que define un número, /d significa un dígito numérico. El signo + significa que tiene que haber uno o más dígitos numéricos. El extra / delante de /d es porque en Java, el / es un carácter especial, por lo que debe escaparse.


Use Scanner.hasNextInt() :

Devuelve true si el siguiente token en la entrada de este escáner se puede interpretar como un valor int en la base por defecto usando el método nextInt() . El escáner no avanza más allá de cualquier entrada.

Aquí hay un fragmento para ilustrar:

Scanner sc = new Scanner(System.in); System.out.print("Enter number 1: "); while (!sc.hasNextInt()) sc.next(); int num1 = sc.nextInt(); int num2; System.out.print("Enter number 2: "); do { while (!sc.hasNextInt()) sc.next(); num2 = sc.nextInt(); } while (num2 < num1); System.out.println(num1 + " " + num2);

No tiene que parseInt ni preocuparse por NumberFormatException . Tenga en cuenta que dado que los métodos hasNextXXX no avanzan más allá de ninguna entrada, es posible que deba llamar a next() si desea saltear la "basura", como se muestra arriba.

Preguntas relacionadas


Veo que Character.isDigit se adapta perfectamente a la necesidad, ya que la entrada será solo un símbolo. Por supuesto, no tenemos ninguna información sobre este objeto kb, pero en caso de que sea una instancia de java.util.Scanner, también sugeriría usar java.io.InputStreamReader para la entrada de línea de comandos. Aquí hay un ejemplo:

java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(System.in)); try { reader.read(); } catch(Exception e) { e.printStackTrace(); } reader.close();