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

Java中如何通过用户输入退出循环?代码输入END报错求优化

问题解决与代码优化建议

一、输入END报错的原因及修复

输入END报错是因为你用sc.nextDouble()尝试读取字符串类型的退出指令,这会触发InputMismatchException。同时嵌套的双层for循环会导致退出指令无法及时中断流程,需要调整循环结构并修改输入读取逻辑。

修复后的完整代码:

import java.util.InputMismatchException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("-------Welcome to the Radius calculator-------");

        boolean keepRunning = true;
        int usageCount = 0;
        int remainingTries = 5;

        while (keepRunning && usageCount < 4 && remainingTries > 0) {
            System.out.println("-----------------------------");
            System.out.println("Hey you can use this calculator " + remainingTries + " more time(s) till you have to purchase our full version only 3.99");
            System.out.println("Please enter your Radius or type END to exit");
            
            // 先读取输入内容,判断是否为退出指令
            String input = sc.next();
            if ("END".equalsIgnoreCase(input)) {
                keepRunning = false;
                break;
            }

            // 尝试将输入转为半径数值
            double radius;
            try {
                radius = Double.parseDouble(input);
            } catch (NumberFormatException e) {
                System.out.println("Invalid input! Please enter a number or END to exit.");
                continue;
            }

            System.out.println("Enter 1 if you would like to get the area");
            System.out.println("Enter 2 if you would like to get the circumference");
            
            // 读取用户选择,处理无效输入
            int choice;
            try {
                choice = sc.nextInt();
            } catch (InputMismatchException e) {
                System.out.println("Invalid choice! Please enter 1 or 2.");
                sc.nextLine(); // 清空缓冲区的无效输入
                continue;
            }

            // 执行计算逻辑
            if (choice == 1) {
                double area = Math.PI * radius * radius;
                System.out.printf("The area of the circle with radius %.2f is: %.2f%n", radius, area);
            } else if (choice == 2) {
                double circumference = 2 * Math.PI * radius;
                System.out.printf("The circumference of the circle with radius %.2f is: %.2f%n", radius, circumference);
            } else {
                System.out.println("No answer for you boss");
                System.out.println("Try again!");
                continue; // 无效选择不消耗使用次数
            }

            // 更新计数
            usageCount++;
            remainingTries--;
            System.out.println("You have used this calculator efficiently " + usageCount + " time(s)");
            System.out.println("-----------------------------");
        }

        sc.close(); // 关闭Scanner释放资源
        System.out.println("Calculator exited.");
    }
}

核心修复点:

  • 先读取字符串输入,判断是否为END(支持大小写不敏感),触发直接终止循环
  • 用try-catch捕获类型转换异常,避免程序崩溃并提示用户
  • 移除冗余的双层for循环,改用单个while循环结合计数变量控制使用次数,逻辑更清晰
  • 关闭Scanner资源,避免资源泄漏

二、代码效率与可维护性提升建议

  • 提取独立方法:把计算面积、周长的逻辑拆成单独方法,简化主代码:
    private static double calculateArea(double radius) {
        return Math.PI * radius * radius;
    }
    
    private static double calculateCircumference(double radius) {
        return 2 * Math.PI * radius;
    }
    
  • 规范变量命名:将num改为radius、num1改为choice,提升代码可读性
  • 修正拼写错误:calcultor→calculator、yoh→you、circumfrence→circumference、effiently→efficiently
  • 使用格式化输出:用printf替代字符串拼接,输出更美观且性能更优
  • 增加边界校验:添加半径不能为负数的判断,提示用户输入有效数值
  • 减少嵌套层级:原代码多层嵌套(while→for→for→if),拆分为线性逻辑后更易调试维护

内容的提问来源于stack exchange,提问作者Melvin Baldwin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 09:30:49