0

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

java.util.Scanner.throwFor(Scanner.java:838) 中的线程“main”java.util.NoSuchElementException 中的异常在 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;
              }

        }
    }
    }
4

3 回答 3

1

NoSuchElementException

由 Enumeration 的 nextElement 方法引发,以指示枚举中没有更多元素。

你得到这个异常是因为没有读取换行符,这是你按下 enter ( ) 时的字符,所以在下一次迭代中,你试图读取它,这会导致异常。Scanner#next \nfor

一种可能的解决方案是在answer.nextLine()之后添加answer.next()吞下额外的\n.


您的代码示例:

Iteration (a) |  input for scanner    |  Data for scanner
--------------+-----------------------+-------------------
      0       |   "Hello" (And enter) |       Hello
      1       |         \n            |      PROBLEM!
于 2013-10-09T09:23:32.913 回答
0

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

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

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

于 2013-10-09T10:39:33.540 回答
0

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

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

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

于 2014-01-16T04:56:11.537 回答