方法中的扫描器对象和 NoSuchElementException



我真的试图通过线程找到答案,但仍然希望得到一些反馈。

我认为下面的代码风格很糟糕,但我不知道为什么它会向我射击 java.util.NoSuchElementException输入数字后,因为我为两个方法制作了两个 Scanner 对象,我应该能够启动一个新的输入。如果我擦除inputAndPrintNumber()中的input.close(),它可以正常工作并正确编译。我真的希望知道为什么以及如何修复它,如果我仍然使用两个扫描仪obj并且尽可能不擦除input.close()

import java.util.*;
public class t{
public static void main(String [] args){
    inputAndPrintNumber();
    inputAndPrintString();
}
public static void inputAndPrintNumber(){
    Scanner input = new Scanner(System.in);
    String s = input.nextLine();        
    System.out.print(s);        
    input.close();
}
public static void inputAndPrintString(){
    Scanner input2 = new Scanner(System.in);
    int a = input2.nextInt();       
    System.out.print(a);
}
}

我什至不确定下面的代码是更好还是更好?

import java.util.*;
public class t{
public static Scanner input = new Scanner(System.in);
public static void main(String [] args){
    inputAndPrintNumber();
    inputAndPrintString();  
    input.close();
}
public static void inputAndPrintNumber(){
    String s = input.nextLine();        
    System.out.print(s);
}
public static void inputAndPrintString(){
    int a = input.nextInt();        
    System.out.print(a);
}
}

当您调用scanner.close()时,它不仅会关闭扫描仪,还会关闭从中读取数据的流,在本例中为 System.in 。因此,如果您要稍后使用System.in请不要关闭它(如果它已关闭,我们将无法重新打开它并从中读取任何数据,因此例外)。

第二个代码示例解决了此问题,因为当您确定不会从输入流读取任何其他内容时,正在关闭扫描程序。

顺便说一句,您似乎混合了应该调用nextLinenextInt的地方(nextLine似乎更适合inputAndPrintString,而nextInt更适合inputAndPrintNumber)。

最新更新