AWT计算器加法时触发NumberFormatException空输入字符串错误求助
AWT计算器加法运算时NumberFormatException异常分析与解决
异常信息
Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:592) at java.lang.Integer.parseInt(Integer.java:615) at calculator.actionPerformed(calculator.java:282) at java.awt.Button.processActionEvent(Button.java:409) at java.awt.Button.processEvent(Button.java:377) at java.awt.Component.dispatchEventImpl(Component.java:4889) at java.awt.Component.dispatchEvent(Component.java:4711) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760) at java.awt.EventQueue.access$500(EventQueue.java:97) at java.awt.EventQueue$3.run(EventQueue.java:709) at java.awt.EventQueue$3.run(EventQueue.java:703) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84) at java.awt.EventQueue$4.run(EventQueue.java:733) at java.awt.EventQueue$4.run(EventQueue.java:731) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74) at java.awt.EventQueue.dispatchEvent(EventQueue.java:730) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
错误原因
- 空字符串解析:异常直接指向
Integer.parseInt处理空字符串"",对应加法计算逻辑行,说明num1或num2未正确捕获到输入数字,为空状态。 - 循环范围错误:代码中
int len=val.length()-1; while(i<len)会漏掉字符串最后一个字符,比如输入"1+2"时,最后一位'2'不会被遍历,导致num2为空。 - 状态变量逻辑混乱:
opactive变量始终为0,未在检测到运算符时切换状态,导致运算符后的数字仍被错误添加到num1;inc偏移量逻辑设计不合理,截取num2时容易得到空字符串。 - 边界情况未处理:未判断输入是否为合法表达式(比如仅输入运算符就按=),也未在解析前检查字符串是否为空。
解决方法
1. 修复循环范围
将循环覆盖完整的输入字符串,确保所有字符都被处理:
// 原代码 int len=val.length()-1; // 修改为 int len=val.length();
2. 重构表达式解析逻辑
替换复杂的偏移量判断,改用状态变量区分数字归属,同时适配浮点数计算:
if(ae.getSource()==bres) { // 重置所有状态变量 res = 0; num1 = ""; num2 = ""; char op = ' '; boolean isNum2 = false; // 遍历输入字符串拆分数字与运算符 for (char c : val.toCharArray()) { if (Character.isDigit(c) || c == '.') { if (isNum2) { num2 += c; } else { num1 += c; } } else if ("+-*/".contains(String.valueOf(c))) { op = c; isNum2 = true; } } // 空值检查,避免解析空字符串 if (num1.isEmpty() || num2.isEmpty()) { t1.setText("输入错误"); return; } // 改用Double处理浮点数,适配小数点功能 double n1 = Double.parseDouble(num1); double n2 = Double.parseDouble(num2); double result = 0; // 根据运算符执行计算 switch(op) { case '+': result = n1 + n2; break; case '-': result = n1 - n2; break; case '*': result = n1 * n2; break; case '/': if (n2 == 0) { t1.setText("除数不能为0"); return; } result = n1 / n2; break; default: t1.setText("输入错误"); return; } t1.setText(String.valueOf(result)); val = String.valueOf(result); // 保留结果用于后续连续计算 }
3. 完善辅助按钮功能
修复C按钮的重置逻辑,确保所有状态变量都被清空:
if(ae.getSource()==bc) { point=0; val=""; num1=""; num2=""; res=0; ractive=0; n1active=0; n2active=0; opactive=0; inc=0; t1.setText(""); }
4. 限制运算符输入合法性
避免开头或连续输入运算符:
if(ae.getSource()==badd) { if(val.isEmpty() || "+-*/".contains(val.substring(val.length()-1))) { return; } val=val+"+"; t1.setText(val); } // 减法、乘法、除法按钮同理添加该检查
内容的提问来源于stack exchange,提问作者Tenny Xavier
相关产品推荐
相关产品推荐

