Excepción a la clase escáner y una solución, teniendo entrada en Java

Aquí, vamos a aprender cómo resolver un error común que se presenta al tratar de tomar la entrada de varias clases (con escáner class) en un programa Java?

Considere el siguiente código,

import java.util.*;
public class test {
public static void main(String args[]) {
c1 obj1 = new c1();
obj1.input();
c2 obj2 = new c2();
obj2.input();
}
}
class c1
{
int age;
String name;
void input()
{
Scanner in = new Scanner(System.in);
System.out.println("Enter age");
age = in.nextInt();
System.out.println("Enter name");
name = in.next();
System.out.println("Name: " + name + " Age: "+ age);
}
}
class c2
{
float perc;
String id;
void input()
{
Scanner in = new Scanner(System.in);
System.out.println("Enter percentage");
perc = in.nextFloat();
System.out.println("Enter ID");
id = in.next();
System.out.println("Id: "+ id + " Percentage: "+ perc);
}
}

Las compilaciones de código sin errores y no parece causar ningún problema. Si tomamos de entrada en cualquier Class SOLAMENTE, es decir, ya sea llamada obj1.input () O obj2.input () , el programa funciona perfectamente. Sin embargo, en el class donde llamamos a la función de entrada de ambas clases, como se muestra, obtenemos el siguiente resultado en tiempo de ejecución.

salida

Enter age
18
Enter name
abc
Name: abc Age: 18
Enter percentage
Exception in thread "main" java.util.NoSuchElementException
at java.base/java.util.Scanner.throwFor(Scanner.java:937)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextFloat(Scanner.java:2496)
at c2.input(test.java:37)
at test.main(test.java:8)

Vemos que la primera entrada [ obj1.input () ] funciona bien, pero conseguimos un error al tomar la entrada en la segunda class. Si cambiamos la secuencia en la que se llaman las dos funciones, vamos a ser capaces de tomar la entrada en la segunda class pero no en la primera. Observamos que siempre obtenemos un error durante el uso de escáner objeto de múltiples clases. Esto es porque el primer objeto de escáner case hace un bloqueo en el flujo de entrada. Incluso si usamos el close () método de escáner class, todavía conseguimos el error porque la corriente se queda encerrado por el primer objeto de escáner class.

La solución al problema es dedicar un class separada para manejar todas las operaciones de entrada. Considere la siguiente actualización de nuestro programa .

import java.util.*;
public class test {
public static void main(String args[]) {
c1 obj1 = new c1();
obj1.input();
c2 obj2 = new c2();
obj2.input();
}
}
class c1
{
int age;
String name;
void input()
{
System.out.println("Enter age");
age = inputclass.in.nextInt();
System.out.println("Enter name");
name = inputclass.in.next();
System.out.println("Name: " + name + " Age: "+ age);
}
}
class c2
{
float perc;
String id;
void input()
{
System.out.println("Enter percentage");
perc = inputclass.in.nextFloat();
System.out.println("Enter ID");
id = inputclass.in.next();
System.out.println("Id: "+ id + " Percentage: "+ perc);
}
}
class inputclass
{
static Scanner in = new Scanner(System.in);
}

salida

Enter age
18
Enter name
abc
Name: abc Age: 18
Enter percentage
89.1
Enter ID
AD101
Id: AD101 Percentage: 89.1


Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *