Java中Try Catch与if else运行异常 手机号校验错误问题排查
问题根因
- 输入未做去空处理 + 校验逻辑顺序颠倒:获取手机号输入后没有去除前后空白字符,用户输入时不小心带的空格会导致10位数字也触发长度校验失败;且原有逻辑先拼接结果文本、渲染UI,后做手机号格式校验,甚至在校验前就使用了未赋值的手机号存储变量,逻辑完全混乱。
- 数值类型选择错误:Java中
int类型的最大值为2147483647,仅支持最大不超过21亿的10位数字,超过该值的10位数字会触发数值溢出,抛出NumberFormatException。手机号不需要参与数值运算,优先用String存储,有转数值需求时请用long类型。
修复方案
1. 变量类型修改
将原有存储手机号的int变量改为long类型:
// 把 private int a; 替换为 private long a;
2. 调整Continue按钮的事件逻辑
将actionPerformed方法中Continue对应的代码替换为以下内容:
if(event.getSource()==Continue){ // 去除输入前后空白字符,避免空格导致校验异常 String num=phone.getText().trim(); String fname=firstname.getText().trim(); String lname=lastname.getText().trim(); // 先校验长度是否符合要求 if(num.length()!=10){ JOptionPane.showMessageDialog(null,"请输入10位手机号","Alert",JOptionPane.ERROR_MESSAGE); return; } // 再校验是否为纯数字 long phoneNum; try{ phoneNum=Long.parseLong(num); }catch(NumberFormatException e){ JOptionPane.showMessageDialog(null,"请输入有效的纯数字手机号","Error",JOptionPane.ERROR_MESSAGE); result.setText(""); phone.setForeground(Color.RED); return; } // 所有校验通过后再执行正常业务逻辑 a = phoneNum; String resulttext="学生姓名:\t"+fname.toUpperCase(Locale.ROOT)+" "+lname.toUpperCase(Locale.ROOT)+"\n登记手机号:\t"+a+"\n学生ID:\t\t"+id.getText().toUpperCase(Locale.ROOT)+"\n学生性别:\t"+entgender.getSelectedItem(); result.setText(resulttext); print.setBounds(700,600,250,30); }
修复说明
- 先对用户输入做
trim()处理,彻底避免空白字符导致的长度校验误判 - 调整逻辑顺序为「去空→长度校验→格式校验→业务处理」,校验失败时直接终止后续逻辑,不会执行正常流程的代码
- 用
long类型存储手机号,解决10位大数溢出的问题 - 所有校验通过后再拼接结果文本、更新UI,不会出现变量未赋值就使用的问题
内容的提问来源于stack exchange,提问作者Satyaki Roy ghatak
相关产品推荐
相关产品推荐

