
本文介绍如何使用 try-catch 机制捕获 numberformatexception,结合循环重试逻辑,健壮地处理非数字、负数及零等无效年龄输入,并提供可复用的错误提示封装。
本文介绍如何使用 try-catch 机制捕获 numberformatexception,结合循环重试逻辑,健壮地处理非数字、负数及零等无效年龄输入,并提供可复用的错误提示封装。
在图形化交互程序中(如使用 JOptionPane),直接调用 Integer.parseInt() 解析用户输入存在严重风险:一旦用户输入字母、符号或空字符串,将立即抛出 NumberFormatException,导致程序崩溃。正确的做法是主动防御式输入验证——将解析操作置于 try 块中,用 catch 捕获异常并引导用户重新输入。
以下为优化后的完整实现:
import javax.swing.JOptionPane;
public class IfStatements {
public static void main(String[] args) {
int age = 0;
// 循环直到获得合法正整数年龄
while (age <= 0) {
try {
String input = JOptionPane.showInputDialog("Enter your Age: ");
// 先判空,避免 null 或空字符串触发 NumberFormatException
if (input == null || input.trim().isEmpty()) {
displayError("Input cannot be empty.");
continue;
}
age = Integer.parseInt(input.trim());
// 验证数值合理性(年龄必须为正)
if (age <= 0) {
displayError("Age must be a positive number.");
age = 0; // 重置,继续循环
continue;
}
} catch (NumberFormatException e) {
displayError("Please enter a valid whole number (e.g., 25).");
continue;
}
// 年龄有效后执行业务逻辑
if (age >= 75) {
JOptionPane.showMessageDialog(null, "You are old!");
} else if (age >= 18) {
JOptionPane.showMessageDialog(null, "You are an adult!");
} else {
JOptionPane.showMessageDialog(null, "You are not an adult!");
}
break; // 退出循环
}
}
private static void displayError(String message) {
JOptionPane.showMessageDialog(null,
message,
"Invalid Input",
JOptionPane.ERROR_MESSAGE);
}
}✅ 关键改进点说明:
- 双重防护:既捕获 NumberFormatException(处理 "abc"、" " 等非法格式),又显式检查空输入和非正数值;
- 用户体验优化:每次错误均弹出清晰提示,不中断程序流程,支持无限次重试;
- 代码健壮性增强:调用 trim() 去除首尾空格,避免 " -5 " 或 " 18 " 等边界情况误判;
- 职责分离:displayError() 封装 UI 错误反馈,便于统一维护与国际化扩展。
⚠️ 注意事项:
立即学习“Java免费学习笔记(深入)”;
- 不要依赖 hasNextInt()(Scanner 场景)或正则预校验替代异常处理——对 JOptionPane 这类阻塞式输入,try-catch 是最直接可靠的方案;
- 避免在 catch 块中静默吞掉异常(如仅 e.printStackTrace()),必须提供用户可理解的反馈;
- 若需支持小数年龄(如 3.5 岁),应改用 Double.parseDouble() 并增加范围校验,但需注意业务语义(年龄通常取整)。
通过这一模式,你不仅能解决当前年龄校验问题,更建立起面向生产环境的输入容错思维:所有外部输入都应视为不可信,验证与恢复必须成为默认路径。


















