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
相关产品推荐
相关产品推荐

