2015-10-19 101 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閱讀。

相關問題