java exception java.util.scanner

java - Escáner NoSuchElementException



java.util.scanner (2)

Tengo un problema con mi asignación de Java. Recibo una excepción inesperada, específicamente:

java.util.NoSuchElementException: no se ha encontrado ninguna línea

Estoy usando Scanner(System.in) y el programa no lee nada continuamente y repite el texto de excepción de "formato no válido". Si ingreso un valor int correcto, la primera parte pasa y luego la parte double entra inmediatamente en esta excepción. Si ingreso un valor int incorrectamente valuado, entonces comienza a repetir la excepción.

Aquí está mi código:

import java.util.Scanner; public class Program_4 { public static void main(String[] args) { getValidInt("Enter an integer from 5 to 50",5,50); getValidDouble("Enter a double from 5.0 to 50.0",5.0,50.0); getValidString("Enter a string with length from 5 to 8 characters",5,8); } public static int getInt(String prompt) { Scanner sc = new Scanner(System.in); int i = 0; boolean isValid; do { try { System.out.print(prompt + ": "); i = Integer.parseInt(sc.nextLine()); isValid = true; } catch (Exception e) { System.out.println(e); System.out.print("Invalid Format: "); isValid = false; } } while (isValid == false); sc.close(); return i; } public static int getValidInt(String prompt, int min, int max) { int i = 0; boolean isValid = false; do { i = getInt(prompt); if(i < min) System.out.println("Value must be >= " + min); else if(i > max) System.out.println("Value must be <= " + max); else isValid = true; } while (isValid == false); return i; } public static double getDouble(String prompt) { Scanner sc = new Scanner(System.in); double i = 0.0; boolean isValid; do { try { System.out.print(prompt + ": "); i = Double.parseDouble(sc.nextLine()); isValid = true; } catch (Exception e) { System.out.println(e); System.out.println("Invalid Format: "); isValid = false; } } while (isValid == false); sc.close(); return i; } public static double getValidDouble(String prompt, double min, double max) { int i = 0; boolean isValid = false; do { i = getInt(prompt); if(i < min) System.out.println("Value must be >= " + min); else if(i > max) System.out.println("Value must be <= " + max); else isValid = true; } while (isValid == false); return i; } public static String getString(String prompt) { Scanner sc = new Scanner(System.in); String i=""; boolean isValid; do { try { System.out.print(prompt + ": "); i = sc.nextLine(); isValid = true; } catch (Exception e) { System.out.print("Invalid Format: "); isValid = false; } } while (isValid == false); sc.close(); return i; } public static String getValidString(String prompt, int min, int max) { String i; boolean isValid = false; do { i = getString(prompt); if(i.length() < min) System.out.println("String must be more than " + min + " characters."); else if(i.length() > max) System.out.println("String must be more than " + max + " characters."); else isValid = true; } while (isValid == false); return i; } }


Dado que imprime el mismo mensaje en los tres lugares donde se detecta una excepción, es difícil decir con certeza qué está pasando:

  • Use printStackTrace() para averiguar dónde está ocurriendo la excepción

  • No atrape Exception así. Captura las excepciones que estás esperando y que tu código está diseñado para manejar. Si detecta Exception , podría terminar atrapando todo tipo de excepciones inesperadas (NPE, fin de archivo, etc.) ... y reportándolas incorrectamente como "Formato inválido".


Tiene más de un Scanner que cerrar, que cierra el InputStream subyacente, por lo tanto, otro Scanner ya no puede leer del mismo InputStream y se NoSuchElementException una NoSuchElementException .

Para aplicaciones de consola, use un solo Scanner para leer desde System.in .