客户端添加动物功能报错求助: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
相关产品推荐
相关产品推荐

