如何解决Java开发中出现java.lang.IllegalArgumentException: No enum constant错误
错误原因
- 核心错误是
Category.valueOf()方法使用逻辑错误:该方法只能接收枚举常量的名称字符串(如"RESTAURANT")作为入参,而你从数据库CATEGORY_ID字段取出的是分类对应的数字ID(如字符串"3"),自然找不到名为3的枚举常量,触发IllegalArgumentException。 - 异常被吞导致后续字段未赋值:
extractCouponFromResult方法的try块中,setCategory抛出异常后直接进入catch块,后面的setTitle、setDescription等赋值逻辑全部没有执行,因此返回的Coupon对象除了id、companyId外其他字段都是默认值。 - 自定义的
Category.fromString()方法存在逻辑错误:直接用枚举对象和字符串做相等判断,永远会返回null,该方法目前不可用。
解决方案
- 先给Category枚举新增按ID匹配的静态方法,同时清理无用代码:
package com.chana.coupons.beans; public enum Category { FOOD(1), ELECTRICITY(2), RESTAURANT(3),VACATION(4); private int id; private Category(int id) { this.id = id; } public int getId() { return id; } // 新增按ID匹配枚举的方法 public static Category fromId(int id) { for (Category c : Category.values()) { if (c.getId() == id) { return c; } } throw new IllegalArgumentException("没有匹配ID的Category枚举: " + id); } // 修复原fromString方法(不需要可直接删除) public static Category fromString(String name) { for (Category c : Category.values()) { if(c.name().equals(name)) { return c; } } return null; } }
枚举是不可变类型,原代码中getId(Category category)、setId(int id,Category category)两个方法没有实际作用,建议直接删除。
- 修改
extractCouponFromResult方法中分类赋值的代码:
把原来的代码:
coupon.setCategory(Category.valueOf(result.getString("CATEGORY_ID").toUpperCase()));
替换为:
int categoryId = result.getInt("CATEGORY_ID"); coupon.setCategory(Category.fromId(categoryId));
修改完成后即可正确按数据库存储的分类ID匹配到对应枚举,后续字段也能正常完成赋值。
内容的提问来源于stack exchange,提问作者chanak
相关产品推荐
相关产品推荐

