Java错误-“;“线程中的异常”;“主要”;java.util.NoSuchElementException

Java错误-“;“线程中的异常”;“主要”;java.util.NoSuchElementException,java,eclipse,Java,Eclipse,我正在上Java编程的入门课,所以请原谅我对编程概念/术语的无知。我当前任务的一部分是读取一个整数(对应于长度,单位为英寸)并将其转换为厘米,将最终转换的数字打印为浮点值。但是,在尝试运行项目(在Eclipse中)时,我总是收到一条错误消息,上面说: Exception in thread "main" java.util.NoSuchElementException at java.util.Scanner.throwFor(Unknown Source) at java.ut

我正在上Java编程的入门课,所以请原谅我对编程概念/术语的无知。我当前任务的一部分是读取一个整数(对应于长度,单位为英寸)并将其转换为厘米,将最终转换的数字打印为浮点值。但是,在尝试运行项目(在Eclipse中)时,我总是收到一条错误消息,上面说:

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.nextInt(Unknown Source)
    at java.util.Scanner.nextInt(Unknown Source)
    at project1.inches(project1.java:82)
    at project1.main(project1.java:17)
我已经检查了我的代码好几次了,但似乎无法找出问题所在——有人能帮我找出如何解决这个问题吗?我将在下面包含一段源代码:

public static void inches() {
    //Define object variables
    int vinch;
    float vcent;

    System.out.println("\n*******************************************************\n");
    System.out.println("Inch to Centimeter Conversion\n\n------------------------\n");

    //Read length (inches)
    System.out.println("Enter a length (in inches):");
    Scanner scanInches = new Scanner(System.in);
    vinch = scanInches.nextInt();

    //Convert input from inches to centimeters & print as float value
    vcent = (float) (vinch * 2.84);
    System.out.println(vinch + " inches is equal to " + vcent + " centimeters.");

    scanInches.close();
}
谢谢你的帮助,我再次为这样一个微不足道的问题道歉


**注意:我确信我的代码中有错误或不切实际之处…如果您发现任何错误或不切实际之处,请随时指出

您不想在

  // scanInches.close();  comment this out
此外,您还应该使用以下命令测试是否存在
int

if (scanInches.hasNextInt())
    vinch = scanInches.nextInt();

运行代码时,我似乎没有看到任何错误。这是代码,我刚刚测试了它,看看它是否正确运行,确实如此,我只做了一些更改

public class Main {

    public static void main(String[] args) {
        inches();
    }

    public static void inches() {
        //Define object variables
        int vinch = 0;
        float vcent;

        System.out.println("\n*******************************************************\n");
        System.out.println("Inch to Centimeter Conversion\n\n------------------------\n");

        //Read length (inches)
        System.out.println("Enter a length (in inches):");
        Scanner scanInches = new Scanner(System.in);

        if (scanInches.hasNextInt())
        {
            vinch = scanInches.nextInt();
        }

        //Convert input from inches to centimeters & print as float value
        vcent = (float) (vinch * 2.54);
        System.out.println(vinch + " inches is equal to " + vcent + " centimeters.");

    }
}

正如您所见,我从英寸方法的底部删除了scanner close方法,因为您不想关闭它。为了安全起见,我还添加了一个检查,看看是否有nextInt可以从用户的输入中获取。同样根据谷歌的说法,转换率是2.54,而不是2.84,所以我也改变了这一点。

让我们分析一下运行时提供的错误消息:

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.nextInt(Unknown Source)
    at java.util.Scanner.nextInt(Unknown Source)
    at project1.inches(project1.java:82)
这意味着您的代码在project1.java的第82行调用了java.util.Scanner.nextInt()方法,该方法通过抛出java.util.NoSuchElementException来表示错误条件

要了解该方法引发此异常的原因,请阅读:

public int nextInt()

将输入的下一个标记扫描为int

此方法的调用形式为nextInt(),其行为方式与调用nextInt(基数)完全相同,其中基数是此扫描程序的默认基数

返回:

从输入扫描的int

抛出:

InputMismatchException-如果下一个标记与整数正则表达式不匹配,或超出范围

NoTouchElementException-如果输入用尽

IllegalStateException-如果此扫描仪已关闭

因此,NoTouchElementException表示您试图读取另一个数字,但System.in已用尽

这很奇怪,因为System.in通常连接到键盘,键盘提供了取之不尽的按键

因此,最可能的原因是您在没有控制台的情况下启动了程序,这是启动配置中的一个设置:


或者他两次调用了这个方法,第二次调用了
系统。在
中将是closedYes,这也是一种可能性,因为关闭的流不能再从中读取。如果还没有,你的类将向你介绍Java的异常处理机制,但既然你今天遇到了错误,你应该继续阅读。请注意,Scanner实现了Closeable接口,这意味着您可以使用try with resources语法()。@WilliamJohnHolden您认为关闭
系统是个好主意吗?我不认为你应该清楚地说明原因。是的,如果多次调用inches()方法,则关闭System.in会产生问题。这位编程新手通过记住关闭I/O流显示了良好的资源纪律。从教学的角度来看,我宁愿有人在学习了有关系统独特行为的绝妙案例后被咬。在中,我也不愿意变得懒惰,永远不会注意到他的程序从不关闭TCP套接字、离开多播组、在C/C++中释放malloc'd内存以及关闭常规文件。Jacob M,@ScaryWombat确实有道理。我将使用try with resources隐式关闭扫描仪,但将扫描仪的单个实例作为参数传递给inches()方法。