You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

错误原因

  1. 空字符串解析:异常直接指向Integer.parseInt处理空字符串"",对应加法计算逻辑行,说明num1或num2未正确捕获到输入数字,为空状态。
  2. 循环范围错误:代码中int len=val.length()-1; while(i<len)会漏掉字符串最后一个字符,比如输入"1+2"时,最后一位'2'不会被遍历,导致num2为空。
  3. 状态变量逻辑混乱:opactive变量始终为0,未在检测到运算符时切换状态,导致运算符后的数字仍被错误添加到num1;inc偏移量逻辑设计不合理,截取num2时容易得到空字符串。
  4. 边界情况未处理:未判断输入是否为合法表达式(比如仅输入运算符就按=),也未在解析前检查字符串是否为空。

解决方法

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 02:54:54