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

如何解决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,该方法目前不可用。

解决方案

  1. 先给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)两个方法没有实际作用,建议直接删除。

  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:00:01