当我以不同的方法插入不同的扫描仪时出现异常

Exception when I insert a different Scanner in different methods

在 main 方法中,我创建了一个对象 cls 并调用了它的方法 test。此方法将调用另外两个方法(test1test2)。每个都有自己的扫描仪。

public static void main(String[] args) {
        Class2 cls = new Class2();
        cls.test();
    }

Class2 是:

  public class Class2 {
 
        public Class2() {
        }
        
    public void test()
    {
        test2();
        test3();
        
    }
    
    public void test2() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("give a String:");
        String str = scanner.next(); 
        scanner.close();
    }
    public void test3()
    {
        Scanner sc = new Scanner(System.in);
        System.out.println("give another String:");
        String str = sc.next();
        sc.close();
        
    }

}

执行后出现异常

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:1478)
    at Class2.test3(Class2.java:25)
    at Class2.test(Class2.java:11)
    at Class1.main(Class1.java:12)

请问我该如何处理这个异常?通过在每种方法中保留不同的扫描仪!

这是您修改后的代码,并带有适当的注释。

Class2.java

import java.util.Scanner;
public class Class2 {
    /*You dont have to create multiple scanner objects*/
    Scanner scan = new Scanner(System.in);

    public void test() {
        /*In order to run the methods in this class itself
        * you have to use static keyword or create object*/
        Class2 obj = new Class2();
        obj.test2();
        obj.test3();
        scan.close();
        /* As this method is run, scan.close() should be placed when you want to close InputStream
        * you will learn this in Java Streams*/
    }

    public void test2() {
        System.out.println("give a String:");
        String str = scan.nextLine();
    }
    public void test3() {
        System.out.println("give another String:");
        String str = scan.nextLine();

    }
}

Main.java

public class Main {
    public static void main(String[] args) {
        Class2 cls = new Class2();
        cls.test();
    }
}

为什么会出现错误?

Ans:当您的代码执行 test2() 方法时,它会在最后使用 scan.close() 关闭扫描器 InputStream,因此当 test3() 是执行它不能再读取数据。解决方案是在 test3() 方法或 test() 方法中关闭扫描器。