
本文介绍如何使用 try-catch 机制捕获 NumberFormatException,结合循环重试逻辑, robust 地校验用户输入的整数有效性,并给出清晰友好的错误提示。
本文介绍如何使用 try-catch 机制捕获 `numberformatexception`,结合循环重试逻辑, robust 地校验用户输入的整数有效性,并给出清晰友好的错误提示。
在图形化交互程序中(如使用 JOptionPane),用户输入具有高度不确定性——可能输入字母、符号、空字符串或负数。直接调用 Integer.parseInt() 会因非数字输入抛出 NumberFormatException,导致程序崩溃。正确的做法是主动防御式校验:将解析操作包裹在 try 块中,捕获异常后引导用户重新输入,而非让异常终止流程。
以下是一个健壮、符合 Java 编码规范的实现方案:
import javax.swing.JOptionPane;
public class IfStatements {
public static void main(String[] args) {
int age = 0;
// 循环直到获得合法正整数
while (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; // 输入有效且已处理,退出循环
} catch (NumberFormatException e) {
displayError("Please enter a valid whole number (e.g., 25).");
}
}
}
private static void displayError(String message) {
JOptionPane.showMessageDialog(null,
message,
"Invalid Input",
JOptionPane.ERROR_MESSAGE);
}
}
✅ 关键设计要点说明:
- 异常捕获精准化:仅捕获 NumberFormatException,不掩盖其他潜在异常;
- 空值与空白字符预检:input == null 或 trim().isEmpty() 可防止 parseInt(null) 抛出 NullPointerException;
- 语义化校验分离:数值解析(parseInt)与业务规则(age > 0)分层校验,职责清晰;
- 用户体验友好:每次错误均弹出明确提示,且不中断主流程,支持无限重试;
- 代码可维护性:错误提示封装为独立方法 displayError(),便于统一管理和国际化扩展。
⚠️ 注意事项:
- 避免使用 while (true) + break 的“硬终止”风格,推荐用有意义的循环条件(如 age
- 类名 IfStatements 遵循 PascalCase 规范,符合 Java 社区约定;
- 实际生产环境中,若需支持浮点年龄或更复杂验证(如最大年龄限制),建议改用 Scanner 结合正则校验,或引入输入验证框架。
通过这套模式,你不仅能解决“输入字母崩溃”的问题,更能建立一套可复用于各类用户输入场景的健壮校验范式。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











