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ónNo atrape
Exception
así. Captura las excepciones que estás esperando y que tu código está diseñado para manejar. Si detectaException
, 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
.