2015-10-19 48 views
1

我写了一个程序与一个单独的类,但我不断收到同样的错误用户输入的三面之后“在线程异常‘的滞留主’java.util.NoSuchElementException

主要代码:

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个边inputed后:

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) 
+0

你必须在'calcPer()'方法之前缺少'}'。 –

回答

1

尝试删除以下行:

console.close(); 

一旦关闭,它不能从console读取。

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

调试这样的问题 - 在异常可能是从病因抛出了漫长的道路 - 是非常棘手的。

+0

这似乎只是我遇到了一个问题,即程序提示用户输入边两次,因为它要求用户输入第1,第2和第3面,而不是打印结果,它会提示输入边第二次,第二次和第三次。有什么建议么? –

0

Scanner#nextDouble抛出NoSuchElementException

如果输入信息已耗尽

的方式就避开它,和一般(也可用于迭代器)使用扫描仪的正确方法是,先检查是否有这样的输入可用。尝试:

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

如果返回false则是根本不存在double阅读。

相关问题