我编写了一个程序,要求输入 3 个整数来输出三角形类型。一切都运行并编译成功,但是,似乎在要求用户查看是否要再次循环的部分,在线编译器输出错误:
线程“main”中的异常 java.util.NoSuchElementException 在 java.util.Scanner.throwFor(Scanner.java:838) 在 java.util.Scanner.next(Scanner.java:1347) 在Assignment5.main(Assignment5.java:56)
import java.util.Scanner;
public class Assignment5 {
public static void main (String[]args)
{
for (int a = 0; a < Integer.MAX_VALUE; a++)
{
Scanner userInput = new Scanner(System.in);
Scanner answer = new Scanner(System.in);
int x,y,z;
System.out.println("Enter the sides of the triangle: ");
x = userInput.nextInt();
y = userInput.nextInt();
z = userInput.nextInt();
Tri isos = new Tri(x,y,z);
Tri equal = new Tri(x,y,z);
Tri scalene = new Tri(x,y,z);
// check the equilateral triangle
System.out.println(equal.toString() + " triangle:");
if (equal.is_isosceles())
System.out.println("\tIt is isosceles");
else
System.out.println("\tIt is not isosceles");
if (equal.is_equilateral())
System.out.println("\tIt is equilateral");
else
System.out.println("\tIt is not a equilateral");
if (equal.is_scalene())
System.out.println("\tIt is scalene");
else
System.out.println("\tIt is not scalene");
System.out.println("Would you like to enter values again? (y/n)" );
String input = answer.next(); //Exception is thrown from here
if (input.equals("y"))
{
System.out.println("ok");
}
else if(!input.equals("y"))
{
System.out.println("Ok, bye.");
break;
}
}
}
}
NoSuchElementException
:
由 Enumeration 的 nextElement 方法抛出,表明 枚举中没有更多元素。
Scanner#next
没有读取新行字符,这是您按 Enter 键 (\n
) 时的字符,因此在下一个 for
迭代中,您将尝试读取它,这会导致异常。
一种可能的解决方案是在
answer.nextLine()
之后添加 answer.next()
,以便吞掉这个额外的 \n
。
您的代码示例:
Iteration (a) | input for scanner | Data for scanner
--------------+-----------------------+-------------------
0 | "Hello" (And enter) | Hello
1 | \n | PROBLEM!
对我来说,answer.next()实际上并没有分配任何值 通常 int name = answer.next() name 被分配给任何答案。我的意思是不能为 name 赋值,因为 answer.next() 没有值。
至少这是我的理解。另一种选择是摆脱answer.next并使用其他扫描仪。 实际上是对此的编辑。
扫描仪从文件或控制台读取。您已经有一个扫描仪(用户输入),第二个扫描仪实际上没有做任何事情,就像它是一个实际的扫描仪一样,它没有任何内容可读取。 摆脱作为扫描器的答案,用 int、String、double 替换 is 并具有 int 答案 = userInput.nextInt(); 或者 双答案 = userInput.nextDouble(); 或者 字符串答案 = userInput.nextLine();
正如您所说,代码可以为您运行,但在在线编译器上编译和执行时却不会。答案扫描仪已耗尽,因为它没有任何元素。
这很尴尬,但我曾经在在线编译器上编译代码时遇到同样的错误,结果发现我没有事先向输入部分提供输入,并期望在线编译器要求输入。
由于您使用两个扫描仪从控制台获取输入,请尝试使用扫描仪 userInput 从文件中获取输入。 (不同的在线编译器可能会有所不同,但会有一个选项提供来自文件的输入)