被塞在“线程”主体中的异常“ java.util.NoSuchElementException [英] Stuck at "Exception in thread "main" java.util.NoSuchElementException

查看:93
本文介绍了被塞在“线程”主体中的异常“ java.util.NoSuchElementException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我写了一个程序与一个单独的类,但我不断得到相同的错误,在用户输入三面之后。



主要代码是:

  package interactiveTriangleWithAClass; 

public class InteractiveTriangleProgramClass

{public static void main(String [] args)throws Exception
{IAclass nums = new IAclass();
双周长;
双面积;

explain();

nums.getNumbers();

circles = nums.calcPer();

area = nums.calcArea();

outputResults(nums,peripheral,area); }

public static void explain()

{System.out.println(此程序计算周长);
System.out.print(和三角形三角形的面积);
System.out.println(3个数字由用户输入。\\
+输出是3个数字,周长和面积。\
+使用单独的课程。\\
+Derek Michel编写的程序); }

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

{nums.getNumbers();
System.out.println();
System.out.println(周长是+周界);
System.out.print(和区域是+区域);
}

课程是:

  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异常{
扫描仪控制台=新的扫描仪(System。in);
System.out.println(Enter the first side。);
num1 = console.nextDouble();
System.out.println(进入第二边);
num2 = console.nextDouble();
System.out.println(进入第三边);
num3 = console.nextDouble();
console.close();
while(num1 <= 0){
System.err.print(Error。Side one must be greater than 0.);
System.out.println(再次输入一个。);
num1 = console.nextDouble();
}
while(num2 <= 0){
System.err.print(Error。Side two must be than than 0.);
System.out.println(再次输入二号);
num2 = console.nextDouble();
}
while(num3 <= 0){
System.err.print(Error。Side three must be greater than 0.);
System.out.println(再次输入三号);
num3 = console.nextDouble();
}
if(num1 + num2< num3){
System.out.println(基于输入的三角形);
System.out.print(不可能创建);
System.exit(0);
}
if(num2 + num3< num1){
System.out.println(基于输入的三角形);
System.out.print(不可能创建);
System.exit(0);
}
if(num1 + num3< num2){
System.out.println(基于输入的三角形);
System.out.print(不可能创建);
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(两边是+ num1 +,+ num2);
System.out.print(and+ num3);
}
}

控制台运行后读取此内容,输入:

 线程main中的异常java.util.NoSuchElementException 
在java.util.Scanner.throwFor(未知源)
在java.util.Scanner.next(未知源)
在java.util.Scanner.nextDouble(未知源)
在interactiveTriangleWithAClass.IAclass.getNumbers(IAclass.java: 48)
在interactiveTriangleWithAClass.InteractiveTriangleProgramClass.outputResults(InteractiveTriangleProgramClass.java:54)
在interactiveTriangleWithAClass.InteractiveTriangleProgramClass.main(InteractiveTriangleProgramClass.java:41)


解决方案

尝试删除以下行:

 code> console.close(); 

您无法从控制台中读取你已经关闭了它。



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



调试这样一个问题 - 异常可能会因为这个原因潜在地被抛出来 - 是非常棘手的。


I wrote a program with a separate class but I keep getting the same error right after the user inputs the three sides.

The main code is:

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); } 
}

The class is:

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);
    }
}

The console reads this after running and after 3 sides are 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)

解决方案

Try removing the following line:

console.close();

You can't read from console once you've closed it.

You almost certainly shouldn't explicitly close your Scanner: doing so will close System.in. It is not a good practice to close a stream that you haven't opened yourself, since some other code may rely on the stream being open, and throw an exception when it isn't.

Debugging such a problem - where the exception is potentially thrown a long way from the cause - is very tricky.

这篇关于被塞在“线程”主体中的异常“ java.util.NoSuchElementException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆