我在运行此 Java 代码 [duplicate] 时不断遇到此错误

i keep getting into this error while running this java code [duplicate]

提问人:Aaron Thomas Cherian 提问时间:9/22/2023 更新时间:9/22/2023 访问量:54

问:

我试图制作一个可以进行加法、减法、乘法和除法的计算器程序,但是在执行 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 类工作并要求我回答,而是打印错误并退出程序。

Java java.util.scanner 计算

评论

0赞 Jorn 9/22/2023
num1.close();将关闭 。之后,您将无法再从中读取,这会导致该错误。System.in

答:

0赞 Randy 9/22/2023 #1

您遇到的错误是由于您使用 Scanner 对象并随后关闭它的方式。当您关闭附加到 的 Scanner 对象时,您实质上是在关闭基础输入流 ()。关闭该流后,您将无法使用其他扫描仪或任何其他方法再次读取该流。System.inSystem.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);