提问人:Aaron Thomas Cherian 提问时间:9/22/2023 更新时间:9/22/2023 访问量:54
我在运行此 Java 代码 [duplicate] 时不断遇到此错误
i keep getting into this error while running this java code [duplicate]
问:
我试图制作一个可以进行加法、减法、乘法和除法的计算器程序,但是在执行 main 方法后,我不断收到此错误
Exception in thread "main" java.util.NoSuchElementException
at java.base/java.util.Scanner.throwFor(Scanner.java:937)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
at Java_Calculator.calculation(Java_Calculator.java:36)
at Java_Calculator.main(Java_Calculator.java:19)
at Java_Calculator.main(Java_Calculator.java:5)
这是我的代码供参考。
import java.util.Scanner;
public class Java_Calculator{
public static void main(String[] args) {
main();
}
static void main(){
System.out.println("Welcome to Java Calculator!!");
System.out.println("By-theclassicalguy");
System.out.println("<------------------------------------------------------>");
System.out.println("1. Perform a Calculation");
System.out.println("2. Exit");
System.out.println("Enter your choice (1/2):");
Scanner input= new Scanner(System.in);
int user_choice=input.nextInt();
input.close();
if (user_choice==1){
calculation();
}else{
System.out.println("Thank you for using this program");
}
}
static void calculation(){
System.out.println("1. Add");
System.out.println("2. Subtract");
System.out.println("3. Multiply");
System.out.println("4. Divide");
Scanner calc_choice=new Scanner(System.in);
System.out.println("Enter your choice (1/2/3/4):");
int choice=calc_choice.nextInt();
calc_choice.close();
if (choice==1){
add();
} else if(choice==2){
sub();
}else if(choice==3){
mult();
}else if(choice==4){
div();
}
}
static void add(){
Scanner num1= new Scanner(System.in);
System.out.println("Enter a number:");
double a=num1.nextDouble();
num1.close();
Scanner num2= new Scanner(System.in);
System.out.println("Enter a second number");
double b=num2.nextDouble();
num2.close();
double add=a+b;
System.out.println("The sum is "+add);
}
static void sub(){
Scanner num1= new Scanner(System.in);
System.out.println("Enter a number:");
double a=num1.nextDouble();
num1.close();
Scanner num2= new Scanner(System.in);
System.out.println("Enter a seconf number:");
double b=num2.nextDouble();
num2.close();
double sub=a-b;
System.out.println("The difference is "+sub);
}
static void mult(){
Scanner num1= new Scanner(System.in);
System.out.println("Enter a number:");
double a=num1.nextDouble();
num1.close();
Scanner num2= new Scanner(System.in);
System.out.println("Enter a second number:");
double b=num2.nextDouble();
num2.close();
double mult=a*b;
System.out.println("The sum is "+mult);
}
static void div(){
Scanner num1= new Scanner(System.in);
System.out.println("Enter numerator:");
double a=num1.nextDouble();
num1.close();
Scanner num2= new Scanner(System.in);
System.out.println("Enter a denominator");
double b=num2.nextDouble();
num2.close();
double div=a/b;
System.out.println("The sum is "+div);
}
}
基本上,我想做的是创建多个方法,每个方法都有其特定的功能,如加法、减法等,这些函数将链接到另一个计算方法,该方法又链接到另一个称为 main 的方法。在每种方法中,我都添加了一个 scanner 类来收集用户的数字。但是我不断收到上面提到的错误,当我运行程序时,Main 方法运行正常,然后当我键入 1 以继续计算方法时,它也打印所需的内容,但之后不是 scanner 类工作并要求我回答,而是打印错误并退出程序。
答:
0赞
Randy
9/22/2023
#1
您遇到的错误是由于您使用 Scanner 对象并随后关闭它的方式。当您关闭附加到 的 Scanner 对象时,您实质上是在关闭基础输入流 ()。关闭该流后,您将无法使用其他扫描仪或任何其他方法再次读取该流。System.in
System.in
若要解决此问题,应将单个 Scanner 对象用于所有输入,并避免关闭它,直到程序完全完成用户输入。
我使用在线 Java 编译器创建了一个示例,在这里进行了测试:http://tpcg.io/_WXXH4N
使用工作扫描程序修改代码:
import java.util.Scanner;
public class Java_Calculator {
private static final Scanner scanner = new Scanner(System.in); // Single scanner object for the entire program
public static void main(String[] args) {
mainMenu();
}
static void mainMenu() {
System.out.println("Welcome to Java Calculator!!");
System.out.println("By-theclassicalguy");
System.out.println("<------------------------------------------------------>");
System.out.println("1. Perform a Calculation");
System.out.println("2. Exit");
System.out.print("Enter your choice (1/2): ");
int user_choice = scanner.nextInt();
if (user_choice == 1) {
calculation();
} else {
System.out.println("Thank you for using this program");
}
}
static void calculation() {
System.out.println("1. Add");
System.out.println("2. Subtract");
System.out.println("3. Multiply");
System.out.println("4. Divide");
System.out.print("Enter your choice (1/2/3/4): ");
int choice = scanner.nextInt();
switch (choice) {
case 1:
add();
break;
case 2:
sub();
break;
case 3:
mult();
break;
case 4:
div();
break;
default:
System.out.println("Invalid choice");
}
}
static double readNumber(String prompt) {
System.out.print(prompt);
return scanner.nextDouble();
}
static void add() {
double a = readNumber("Enter a number: ");
double b = readNumber("Enter a second number: ");
System.out.println("The sum is " + (a + b));
}
static void sub() {
double a = readNumber("Enter a number: ");
double b = readNumber("Enter a second number: ");
System.out.println("The difference is " + (a - b));
}
static void mult() {
double a = readNumber("Enter a number: ");
double b = readNumber("Enter a second number: ");
System.out.println("The product is " + (a * b));
}
static void div() {
double a = readNumber("Enter numerator: ");
double b;
do {
b = readNumber("Enter a denominator: ");
if (b == 0) {
System.out.println("Denominator cannot be zero. Please enter again.");
}
} while (b == 0);
System.out.println("The result is " + (a / b));
}
}
评论
0赞
Aaron Thomas Cherian
9/22/2023
非常感谢。我有python背景,对java非常陌生。我无法理解这部分,还有这部分,还有你在哪里关闭了扫描仪?static double readNumber(String prompt) { System.out.print(prompt); return scanner.nextDouble(); }
private static final Scanner scanner = new Scanner(System.in);
评论
num1.close();
将关闭 。之后,您将无法再从中读取,这会导致该错误。System.in