扫描仪NoSuchElementException

问题描述 投票:0回答:3

我编写了一个程序,要求输入 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;
              }

        }
    }
    }
java java.util.scanner
3个回答
1
投票

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!

0
投票

对我来说,answer.next()实际上并没有分配任何值 通常 int name = answer.next() name 被分配给任何答案。我的意思是不能为 name 赋值,因为 answer.next() 没有值。

至少这是我的理解。另一种选择是摆脱answer.next并使用其他扫描仪。 实际上是对此的编辑。

扫描仪从文件或控制台读取。您已经有一个扫描仪(用户输入),第二个扫描仪实际上没有做任何事情,就像它是一个实际的扫描仪一样,它没有任何内容可读取。 摆脱作为扫描器的答案,用 int、String、double 替换 is 并具有 int 答案 = userInput.nextInt(); 或者 双答案 = userInput.nextDouble(); 或者 字符串答案 = userInput.nextLine();


0
投票

正如您所说,代码可以为您运行,但在在线编译器上编译和执行时却不会。答案扫描仪已耗尽,因为它没有任何元素。

这很尴尬,但我曾经在在线编译器上编译代码时遇到同样的错误,结果发现我没有事先向输入部分提供输入,并期望在线编译器要求输入。

由于您使用两个扫描仪从控制台获取输入,请尝试使用扫描仪 userInput 从文件中获取输入。 (不同的在线编译器可能会有所不同,但会有一个选项提供来自文件的输入)

© www.soinside.com 2019 - 2024. All rights reserved.