使用Java输入时,Scanner类和解决方案异常

请看以下代码,

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);
        
    }
}

该代码编译没有错误,并且似乎不会引起任何问题。如果只接受任何一个类中的输入,即调用obj1.input()或obj2.input(),则该程序将完美运行。但是,在我们调用两个类的输入函数的情况下,如图所示,我们在运行时得到以下输出。

输出结果

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)

我们看到第一个输入[obj1.input()]可以正常工作,但在第二个类中进行输入时却出错。如果我们交换调用这两个函数的顺序,我们将能够在第二类而不是第一类中接受输入。我们观察到,在多个类中使用Scanner对象时,总是会出错。这是因为Scanner类的第一个对象在输入流上进行了锁定。即使我们使用close()Scanner类的方法,也仍然会收到错误,因为流被Scanner类的第一个对象锁定了。

解决该问题的方法是指定一个单独的类来处理所有输入操作。请看以下对我们程序的更新

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);
}

输出结果

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