扫描仪NoSuchElementException

时间:2013-10-09 09:17:33

标签: java compiler-construction

我制作了一个程序,要求输出3个整数的三角形。一切都运行并编译成功,但是,似乎它要求用户查看是否要再次循环它的部分,在线编译器输出错误:

  

线程“main”java.util.NoSuchElementException中的异常           at 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;
              }

        }
    }
    }

3 个答案:

答案 0 :(得分: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!

答案 1 :(得分:0)

对我来说,似乎answer.next()实际上没有赋值给它 通常int name = answer.next()名称被分配给答案。我的意思是名称不能分配一个值,因为answer.next()没有。

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

扫描程序从文件或控制台读取。您已经有一台扫描仪(userInput),第二台扫描仪实际上并没有做任何事情,它是一台真正的扫描仪,它没有任何东西可读。 摆脱扫描仪的答案,替换是与int,String,double和拥有 int answer = userInput.nextInt(); 要么 double answer = userInput.nextDouble(); 要么 String answer = userInput.nextLine();

答案 2 :(得分:0)

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

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

由于您使用两台扫描仪从控制台获取输入,因此请尝试使用scanner userInput从文件中获取输入。 (对于不同的在线编译器,它可能会有所不同,但是可以选择从文件中提供输入)