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

客户端添加动物功能报错求助:NumberFormatException排查修复

问题根源诊断

你的报错原因非常清晰:客户端代码错误地将物种名称(比如"canine")当作整数类型的物种ID(species id)来解析了。

看你触发报错的代码行:

addM = addAnimal(addnametxt.getText().toLowerCase(), adddiscriptiontxt.getText().toLowerCase(), Integer.parseInt(addspeciestxt.getText()));

服务器端要求第三个参数是species id(整数),但你从addspeciestxt输入框拿到的是字符串"canine"(物种的名称),调用Integer.parseInt()自然会抛出NumberFormatException——因为字母串根本转不成整数。

具体解决方案

我给你几个递进的解决思路,你可以根据自己的需求选择:

方案1:强制用户输入物种ID(最简单直接)

修改输入提示,明确告诉用户需要输入整数类型的物种ID,同时在代码里添加输入验证:

String speciesInput = addspeciestxt.getText().trim();
if (speciesInput.isEmpty()) {
    JOptionPane.showMessageDialog(null, "请输入物种ID");
    return;
}
Integer speciesId = null;
try {
    speciesId = Integer.parseInt(speciesInput);
} catch (NumberFormatException e) {
    JOptionPane.showMessageDialog(null, "物种ID必须是整数,请重新输入");
    return;
}
// 用正确的ID调用方法
addM = addAnimal(addnametxt.getText().toLowerCase(), adddiscriptiontxt.getText().toLowerCase(), speciesId);

方案2:支持用户输入物种名称(更友好)

如果用户习惯输入物种名称(比如"canine"),你需要做一个物种名称到ID的映射,把数据库里的物种名称和对应的ID对应起来:

// 提前在类里初始化映射(要和你的Access数据库里的物种ID对应)
private static final Map<String, Integer> SPECIES_MAP = new HashMap<>();
static {
    SPECIES_MAP.put("canine", 1);
    SPECIES_MAP.put("feline", 2);
    SPECIES_MAP.put("avian", 3);
    // 这里继续添加你数据库里的其他物种
}

// 然后在按钮点击方法里处理:
String speciesInput = addspeciestxt.getText().toLowerCase().trim();
Integer speciesId = null;

// 先尝试直接转成ID(兼容用户输入数字的情况)
try {
    speciesId = Integer.parseInt(speciesInput);
} catch (NumberFormatException e) {
    // 转失败就从映射里找对应的ID
    speciesId = SPECIES_MAP.get(speciesInput);
    if (speciesId == null) {
        JOptionPane.showMessageDialog(null, "请输入有效的物种ID或已知物种名称(如canine)");
        return;
    }
}

// 调用添加方法
addM = addAnimal(addnametxt.getText().toLowerCase(), adddiscriptiontxt.getText().toLowerCase(), speciesId);

方案3:用下拉菜单彻底避免输入错误(最稳妥)

直接把所有物种做成下拉选择框(JComboBox),用户不用手动输入,直接选择即可,从根源上消除输入错误:

// 初始化下拉菜单(显示名称+ID,方便用户识别)
JComboBox<String> speciesCombo = new JComboBox<>(new String[]{
    "犬类(1)", "猫类(2)", "鸟类(3)"
});
// 把这个下拉菜单替换原来的addspeciestxt输入框

// 在按钮点击方法里获取选中项并解析ID:
String selectedItem = (String) speciesCombo.getSelectedItem();
// 从选中的字符串里提取ID
Integer speciesId = Integer.parseInt(selectedItem.split("\\(")[1].replace(")", ""));

// 调用添加方法
addM = addAnimal(addnametxt.getText().toLowerCase(), adddiscriptiontxt.getText().toLowerCase(), speciesId);
额外提醒

不管选哪个方案,都建议在用户输入后做非空检查,避免因为输入框为空导致的其他异常。另外,最好把数据库里的物种数据缓存到客户端的映射里,而不是硬编码,这样后续数据库物种更新时,客户端不用改代码。

内容的提问来源于stack exchange,提问作者MO_Tries

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:57:29