以下代码从System.in
获取1,2或3的输入并作出相应的操作,循环试验直到数字" 3(或无效String
)"输入,程序退出。我需要使用nextLine()
代替nextInt()
,以便输入像" 123"或" 123abc"一切都落入了最后的"否则"并导致程序退出。
该程序第一次正常工作,但在第二次迭代时,控制台输出Trial 2:
,然后我得到NoSuchElementException: No line found
。查看下面的堆栈跟踪。
public static void main(String[] args){
int trialNumber = 1;
Scanner s = new Scanner(System.in);
String input = null;
while (true) {
System.out.print("Trial " + trialNumber + ": ");
input = s.nextLine();
int type = determineInputType(input); //Parses input and returns 1 2 or 3
if (type == 1) {
// ...
}
else if (type == 2) {
// ...
}
else {
System.out.println("Exiting!");
break;
}
trialNumber++;
}
s.close();
}
这是堆栈跟踪:
Exception in thread "main" java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Unknown Source)
at edu.iastate.cs228.hw4.InfixPostfix.main(InfixPostfix.java:39)
感谢您的帮助!
编辑:以下是determineInputType(输入)的来源
private static int determineInputType(String input) {
switch (input) {
case "1":
return 1;
case "2":
return 2;
case "3":
return 3;
default:
System.out.println("Invalid option.");
return 0;
}
}
答案 0 :(得分:4)
您可能正在Scanner
方法或determineInputType
中的某个位置创建新的// ...
。
当您关闭Scanner
时,它使用的InputStream
也会关闭。因此,如果您为Scanner
打开System.in
然后将其关闭,则其他所有已打开的Scanner
将无法再从System.in
读取。
示例:
public static void main(String[]args) {
// [...]
Scanner s = new Scanner(System.in);
String myString = s.nextLine();
determineInputType(myString);
// [...]
s.close();
}
public static void determineInputType(String str) {
// [...]
Scanner s1 = new Scanner(System.in);
// [...]
/* This will affect the 's' Scanner from the 'main' method too
* as it closes System.in, which is being used from 's' too
*/
s1.close();
}
答案 1 :(得分:0)
我尝试执行此代码
这一行是可能的问题。我直接将输入设置为1(int type = 1;
而不是该方法)。 ,然后它按预期工作。
public class Snippet {
public static void main(String[] args){
int trialNumber = 1;
Scanner s = new Scanner(System.in);
String input = null;
while (true) {
System.out.print("Trial " + trialNumber + ": ");
input = s.nextLine();
int type = determineInputType(input);
if (type == 1) {
// ...
}
else if (type == 2) {
// ...
}
else {
System.out.println("Exiting!");
break;
}
trialNumber++;
}
s.close();
}
private static int determineInputType(String input) {
switch (input) {
case "1":
return 1;
case "2":
return 2;
case "3":
return 3;
default:
System.out.println("Invalid option.");
return 0;
}
}
}
答案 2 :(得分:0)
您的代码中只需要一行:
public static void main(String[] args){
int trialNumber = 1;
Scanner s = new Scanner(System.in);
String input = null;
while (true) {
System.out.print("Trial " + trialNumber + ": ");
s.nextLine();
input = s.nextLine();
int type = determineInputType(input); //Parses input and returns 1 2 or 3
if (type == 1) {
// ...
}
else if (type == 2) {
// ...
}
else {
System.out.println("Exiting!");
break;
}
trialNumber++;
}
s.close();
}