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