我真的试图通过线程找到答案,但仍然希望得到一些反馈。
下面的代码是我认为不好的风格,但我不知道为什么它会拍我
输入数字后java.util.NoSuchElementException
,因为我为两个方法制作了两个Scanner对象,我应该能够开始一个新的输入。如果我擦除inputAndPrintNumber()中的input.close()
,它可以正常工作和编译。我真的希望知道为什么以及如何解决它,如果我仍然使用两个Scanner 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);
}
}
答案 0 :(得分:2)
当您致电scanner.close()
时,它不仅会关闭扫描程序,还会关闭数据流,在这种情况下System.in
。因此,如果您要继续使用System.in
,请不要关闭它(如果它已关闭,我们无法重新打开它并从中读取任何数据,因此例外)。
您的第二个代码示例解决了此问题,因为当您确定不会从输入流中读取任何其他内容时,扫描程序将被关闭。
顺便说一句,您似乎混淆了应该调用nextLine
和nextInt
的地方(nextLine
似乎更适合inputAndPrintString
而nextInt
适用{ {1}})。