You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java计算器添加while循环实现持续使用的技术求助

解决计算器持续使用的循环问题

核心问题分析

  • 主菜单无循环逻辑,仅执行一次即退出
  • 多Scanner实例导致输入处理冲突
  • nextInt()/nextDouble()后未清理残留换行符,引发后续nextLine()读取空值

修正方案

  1. 使用单个Scanner实例处理所有输入,避免资源冲突
  2. 在主方法中添加while(true)循环,直到用户输入QUIT才终止程序
  3. 每次调用nextInt()/nextDouble()后,调用scanner.nextLine()消耗残留换行符
  4. 将standard()和scientific()改为void方法,移除无实际用途的返回值
  5. 增加无效输入判断与异常处理,提升程序健壮性

修正后的完整代码

import java.util.Scanner;
import java.lang.Math;
import java.lang.ArithmeticException;

public class Calculator {
    static Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) {
        System.out.println("Welcome to my calculator:");
        String choice = "";

        while (true) {
            System.out.println("\nType 1 for Standard calculator, 2 for Scientific calculator, or QUIT to exit:");
            choice = scanner.nextLine().trim();

            if (choice.equalsIgnoreCase("QUIT")) {
                System.out.println("System quit");
                break;
            } else if (choice.equals("1")) {
                standard();
            } else if (choice.equals("2")) {
                scientific();
            } else {
                System.out.println("Invalid input, please try again.");
            }
        }
        scanner.close();
    }

    public static void standard() {
        System.out.println("\nStandard Calculator chosen.");
        System.out.println("Type 1 for addition, 2 for subtraction, 3 for multiplication, 4 for exponent, 5 for division, 6 for mod:");
        
        // 校验输入是否为有效数字
        while (!scanner.hasNextInt()) {
            System.out.println("Please enter a valid number (1-6):");
            scanner.nextLine();
        }
        int input2 = scanner.nextInt();
        scanner.nextLine(); // 清理换行符

        int num1 = 0;
        int num2 = 0;

        switch (input2) {
            case 1:
                System.out.println("(Add chosen) Enter first value:");
                num1 = scanner.nextInt();
                System.out.println("Enter second value:");
                num2 = scanner.nextInt();
                scanner.nextLine();
                System.out.printf("Addition - (%d + %d) = %d%n", num1, num2, Math.addExact(num1, num2));
                break;
            case 2:
                System.out.println("(Sub chosen) Enter first value:");
                num1 = scanner.nextInt();
                System.out.println("Enter second value:");
                num2 = scanner.nextInt();
                scanner.nextLine();
                System.out.printf("Subtraction - (%d - %d) = %d%n", num1, num2, Math.subtractExact(num1, num2));
                break;
            case 3:
                System.out.println("(Multi chosen) Enter first value:");
                num1 = scanner.nextInt();
                System.out.println("Enter second value:");
                num2 = scanner.nextInt();
                scanner.nextLine();
                System.out.printf("Multiplication - (%d * %d) = %d%n", num1, num2, Math.multiplyExact(num1, num2));
                break;
            case 4:
                System.out.println("(Exp chosen) Enter base value:");
                num1 = scanner.nextInt();
                System.out.println("Enter exponent:");
                num2 = scanner.nextInt();
                scanner.nextLine();
                System.out.printf("Exponent - (%d^%d) = %.2f%n", num1, num2, Math.pow(num1, num2));
                break;
            case 5:
                System.out.println("(Div chosen) Enter dividend:");
                num1 = scanner.nextInt();
                System.out.println("Enter divisor:");
                num2 = scanner.nextInt();
                scanner.nextLine();
                try {
                    System.out.printf("Division - (%d / %d) = %d%n", num1, num2, Math.floorDiv(num1, num2));
                } catch (ArithmeticException e) {
                    System.out.println("Error: Division by zero is not allowed.");
                }
                break;
            case 6:
                System.out.println("(Mod chosen) Enter dividend:");
                num1 = scanner.nextInt();
                System.out.println("Enter divisor:");
                num2 = scanner.nextInt();
                scanner.nextLine();
                try {
                    System.out.printf("Mod - (%d %% %d) = %d%n", num1, num2, Math.floorMod(num1, num2));
                } catch (ArithmeticException e) {
                    System.out.println("Error: Division by zero is not allowed.");
                }
                break;
            default:
                System.out.println("Invalid operation choice, please try again.");
        }
    }

    public static void scientific() {
        System.out.println("\nScientific Calculator chosen.");
        System.out.println("Type 1 for sin, 2 for cos, 3 for tan, 4 for floor, 5 for ceil, 6 for square root, 7 for cube root, 8 for rounding, 9 for min, 10 for max:");
        
        while (!scanner.hasNextInt()) {
            System.out.println("Please enter a valid number (1-10):");
            scanner.nextLine();
        }
        int input2 = scanner.nextInt();
        scanner.nextLine(); // 清理换行符

        double val1 = 0.0;
        double val2 = 0.0;

        switch (input2) {
            case 1:
                System.out.println("(Sin chosen) Enter value (in radians):");
                val1 = scanner.nextDouble();
                scanner.nextLine();
                System.out.printf("Sin - (%.2f) = %.4f%n", val1, Math.sin(val1));
                break;
            case 2:
                System.out.println("(Cos chosen) Enter value (in radians):");
                val1 = scanner.nextDouble();
                scanner.nextLine();
                System.out.printf("Cos - (%.2f) = %.4f%n", val1, Math.cos(val1));
                break;
            case 3:
                System.out.println("(Tan chosen) Enter value (in radians):");
                val1 = scanner.nextDouble();
                scanner.nextLine();
                System.out.printf("Tan - (%.2f) = %.4f%n", val1, Math.tan(val1));
                break;
            case 4:
                System.out.println("(Floor chosen) Enter value:");
                val1 = scanner.nextDouble();
                scanner.nextLine();
                System.out.printf("Floor - (%.2f) = %.0f%n", val1, Math.floor(val1));
                break;
            case 5:
                System.out.println("(Ceil chosen) Enter value:");
                val1 = scanner.nextDouble();
                scanner.nextLine();
                System.out.printf("Ceil - (%.2f) = %.0f%n", val1, Math.ceil(val1));
                break;
            case 6:
                System.out.println("(Square root chosen) Enter non-negative value:");
                val1 = scanner.nextDouble();
                scanner.nextLine();
                if (val1 >= 0) {
                    System.out.printf("Square root - (%.2f) = %.4f%n", val1, Math.sqrt(val1));
                } else {
                    System.out.println("Error: Square root of negative number is not real.");
                }
                break;
            case 7:
                System.out.println("(Cube root chosen) Enter value:");
                val1 = scanner.nextDouble();
                scanner.nextLine();
                System.out.printf("Cube root - (%.2f) = %.4f%n", val1, Math.cbrt(val1));
                break;
            case 8:
                System.out.println("(Round chosen) Enter value:");
                val1 = scanner.nextDouble();
                scanner.nextLine();
                System.out.printf("Round - (%.2f) = %.0f%n", val1, Math.round(val1));
                break;
            case 9:
                System.out.println("(Min chosen) Enter first value:");
                val1 = scanner.nextDouble();
                System.out.println("Enter second value:");
                val2 = scanner.nextDouble();
                scanner.nextLine();
                System.out.printf("Minimum - (%.2f, %.2f) = %.2f%n", val1, val2, Math.min(val1, val2));
                break;
            case 10:
                System.out.println("(Max chosen) Enter first value:");
                val1 = scanner.nextDouble();
                System.out.println("Enter second value:");
                val2 = scanner.nextDouble();
                scanner.nextLine();
                System.out.printf("Maximum - (%.2f, %.2f) = %.2f%n", val1, val2, Math.max(val1, val2));
                break;
            default:
                System.out.println("Invalid operation choice, please try again.");
        }
    }
}

关键改进说明

  • 循环控制:主菜单被while(true)包裹,用户输入QUIT时通过break退出循环,实现持续使用
  • 输入稳定性:统一Scanner实例并清理换行符,解决了输入读取异常问题
  • 健壮性提升:新增无效输入校验、除零异常捕获、负数开平方判断等,避免程序崩溃
  • 代码简洁性:移除无意义返回值,优化输出格式,提升可读性

内容的提问来源于stack exchange,提问作者Alfy James

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 22:31:12