Java 方法中的扫描器对象和NoTouchElementException

Java 方法中的扫描器对象和NoTouchElementException,java,java.util.scanner,Java,Java.util.scanner,我真的试图通过这些线索找到答案,但仍然希望得到一些反馈 下面的代码是糟糕的风格,我想,但我不知道为什么它射击我一个 java.util.NoSuchElementException输入数字后,因为我为两个方法创建了两个Scanner对象,应该能够启动新的输入。如果我删除inputAddPrintNumber()中的input.close(),它会正常工作并正确编译。如果我仍然使用两个扫描器obj并且不删除输入。close()(如果可能的话),我真的希望知道为什么以及如何修复它 import ja

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

下面的代码是糟糕的风格,我想,但我不知道为什么它射击我一个
java.util.NoSuchElementException
输入数字后,因为我为两个方法创建了两个Scanner对象,应该能够启动新的输入。如果我删除inputAddPrintNumber()中的
input.close()
,它会正常工作并正确编译。如果我仍然使用两个扫描器obj并且不删除
输入。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
。因此,如果您打算在以后的中使用系统,请不要关闭它(如果它已关闭,我们将无法重新打开它并从中读取任何数据,因此出现异常)

您的第二个代码示例解决了这个问题,因为当您确定不会从输入流中读取任何其他内容时,扫描仪将关闭


顺便说一句,您似乎混合了应该调用
nextLine
nextLine
的地方(
nextLine
似乎更适合
inputdprintstring
nextInt
用于
inputdprintnumber
)。

谢谢Pshemo,我选择将Scanner对象发送到任何需要输入的方法。只是仍在想做这项工作的最佳方法。很难说哪种方法是最好的,因为这完全取决于你想如何使用扫描仪。主要的一点是,不要每次从用户读取数据时都重新创建扫描仪,如果要读取更多数据,也不要关闭扫描仪。若您决定在main方法中创建scanner并将其传递给其他方法,那个么它是可以的。使用第二种方法也可以,但只需将可访问性更改为
publicstaticscanner input=newscanner(System.in)
因为这样您也可以创建一个扫描器并在方法中重用它。