【问题标题】:Stuck at "Exception in thread "main" java.util.NoSuchElementException卡在“线程“主”中的异常 java.util.NoSuchElementException
【发布时间】:2015-10-19 20:56:14
【问题描述】:

我编写了一个带有单独类的程序,但在用户输入三个侧面后我一直收到相同的错误。

主要代码是:

package interactiveTriangleWithAClass;

public class InteractiveTriangleProgramClass

{ public static void main (String [] args) throws Exception
  { IAclass nums = new IAclass();
    double perimeter;
    double area;

    explain();

    nums.getNumbers();

    perimeter = nums.calcPer();

    area = nums.calcArea();

    outputResults(nums, perimeter, area);   }

  public static void explain()

  { System.out.println("This program calculates the perimeter ");
    System.out.print("and the area of 3 sides for a triangle. ");
    System.out.println("The 3 numbers are entered by the user.\n"
      + "The output is the 3 numbers, the perimeter and the area.\n"
      + "A seperate class is used.\n"
      + "Program written by Derek Michel");  }

  public static void outputResults(IAclass nums, double area, double perimeter) throws Exception

  { nums.getNumbers();
    System.out.println();
    System.out.println("The perimeter is " + perimeter);
    System.out.print(" and the area is " + area); } 
}

班级是:

package interactiveTriangleWithAClass;
import java.util.*;
public class IAclass {
    private double num1, num2, num3;
    public IAclass() {
        num1 = num2 = num3 = 3;
    }
    public IAclass(double value1, double value2, double value3) {
        num1 = value1;
        num2 = value2;
        num3 = value3;
    }
    public void getNumbers() throws Exception {
        Scanner console = new Scanner(System. in );
        System.out.println("Enter the first side.");
        num1 = console.nextDouble();
        System.out.println("Enter the second side.");
        num2 = console.nextDouble();
        System.out.println("Enter the third side.");
        num3 = console.nextDouble();
        console.close();
        while (num1 <= 0) {
            System.err.print("Error. Side one must be greater than 0.");
            System.out.println("Enter side one again.");
            num1 = console.nextDouble();
        }
        while (num2 <= 0) {
            System.err.print("Error. Side two must be greater than 0.");
            System.out.println("Enter side two again.");
            num2 = console.nextDouble();
        }
        while (num3 <= 0) {
            System.err.print("Error. Side three must be greater than 0.");
            System.out.println("Enter side three again.");
            num3 = console.nextDouble();
        }
        if (num1 + num2 < num3) {
            System.out.println("Based on the sides inputed, your triangle ");
            System.out.print("is impossible to create.");
            System.exit(0);
        }
        if (num2 + num3 < num1) {
            System.out.println("Based on the sides inputed, your triangle ");
            System.out.print("is impossible to create.");
            System.exit(0);
        }
        if (num1 + num3 < num2) {
            System.out.println("Based on the sides inputed, your triangle ");
            System.out.print("is impossible to create.");
            System.exit(0);
        }
    }
    public double calcPer() {
        return (num1 + num2 + num3);
    }
    public double calcArea() {
        double s;
        s = (num1 + num2 + num3) / 2;
        return (Math.sqrt(s * (s - num1) * (s - num2) * (s - num3)));
    }
    public void outputNumbers() {
        System.out.print("The sides are " + num1 + ", " + num2);
        System.out.print(" and" + num3);
    }
}

控制台在运行后和输入3边后读取这个:

Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Unknown Source)
    at java.util.Scanner.next(Unknown Source)
    at java.util.Scanner.nextDouble(Unknown Source)
    at interactiveTriangleWithAClass.IAclass.getNumbers(IAclass.java:48)
    at interactiveTriangleWithAClass.InteractiveTriangleProgramClass.outputResults(InteractiveTriangleProgramClass.java:54)
    at interactiveTriangleWithAClass.InteractiveTriangleProgramClass.main(InteractiveTriangleProgramClass.java:41)

【问题讨论】:

  • 您必须在calcPer() 方法之前缺少}

标签: java exception double nosuchelementexception


【解决方案1】:

尝试删除以下行:

console.close();

关闭console 后,您将无法阅读它。

您几乎可以肯定不应该明确关闭您的Scanner:这样做会关闭System.in。关闭您自己未打开的流不是一个好习惯,因为其他一些代码可能依赖于打开的流,并在未打开时抛出异常。

调试这样的问题 - 异常可能与原因相距甚远 - 非常棘手。

【讨论】:

  • 这似乎只是我遇到了另一个问题,即程序提示用户输入边两次,因为它要求用户输入边 1、2 和 3,而不是打印结果提示第二次输入1、2、3面。有什么建议吗?
【解决方案2】:

Scanner#nextDouble 抛出 NoSuchElementException

如果输入耗尽

避免它的方法,以及通常使用扫描仪(也适用于迭代器)的正确方法是首先检查是否有这样的输入可用。试试:

if (scanner.hasNextDouble())
    scanner.nextDouble();

如果调用返回false,则根本没有double 可供读取。

【讨论】:

    猜你喜欢
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    相关资源
    最近更新 更多