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

Java枚举转换报错:IllegalArgumentException问题排查与解决

解决T恤尺码枚举转换错误及下拉菜单实现

一、修复枚举转换错误

错误原因

你当前的代码尝试将包含多个尺码的字符串(如S,M,L,XL,XXL)直接传入Size.valueOf()方法,但该方法仅能识别枚举中定义的单个常量,因此触发IllegalArgumentException。

修复代码

将原有的单尺码转换逻辑,改为拆分多尺码字符串并逐个转换:

for (int i = 1; i < TShirtData.size(); i++) {
    // 原有代码:拆分T恤基础信息、处理商品码...
    String[] elements = TShirtData.get(i).split("\\[");
    String[] tshirtInfo = elements[0].split(",");
    String name = tshirtInfo[0];
    long productCode = 0;
    try {
        productCode = Long.parseLong(tshirtInfo[1]);
    } catch (NumberFormatException n) {
        System.out.println("Error in file. Product code could not be parsed for t-shirt on line " + (i + 1) + ". Terminating. \nError message: " + n.getMessage());
        System.exit(0);
    }

    // 修复后的尺码转换逻辑
    String rawSizes = elements[1].replace("],", "").trim();
    String[] sizeTokens = rawSizes.split(",");
    List<Size> tshirtSizes = new ArrayList<>();
    
    for (String token : sizeTokens) {
        try {
            // 去除可能的空格,避免因格式问题导致转换失败
            Size size = Size.valueOf(token.trim());
            tshirtSizes.add(size);
        } catch (IllegalArgumentException e) {
            // 容错处理:记录无效尺码,不终止程序(可根据需求调整)
            System.err.println("无效尺码 '" + token + "',位于文件第" + (i+1) + "行");
        }
    }
    
    // 后续逻辑:使用tshirtSizes列表处理该T恤的尺码...
}

二、实现尺码下拉菜单(Swing示例)

利用JComboBox结合Size枚举实现下拉选择,同时通过自定义渲染器显示友好名称(如"Small"而非"S"):

import javax.swing.*;
import java.awt.*;

public class SizeDropdownExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("选择T恤尺码");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 150);
        frame.setLayout(new FlowLayout());

        // 创建基于Size枚举的下拉菜单
        JComboBox<Size> sizeDropdown = new JComboBox<>(Size.values());
        
        // 自定义渲染器,显示枚举的友好名称
        sizeDropdown.setRenderer(new DefaultListCellRenderer() {
            @Override
            public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
                super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
                if (value instanceof Size) {
                    setText(((Size) value).toString());
                }
                return this;
            }
        });

        // 添加选择事件监听
        sizeDropdown.addActionListener(e -> {
            Size selected = (Size) sizeDropdown.getSelectedItem();
            JOptionPane.showMessageDialog(frame, "你选择的尺码是:" + selected.toString());
        });

        frame.add(sizeDropdown);
        frame.setVisible(true);
    }
}

说明

  • 下拉菜单默认通过Size.values()加载所有枚举常量;
  • 自定义渲染器调用你重写的toString()方法,显示用户友好的尺码名称;
  • 监听事件可获取用户选择的枚举值,用于后续业务逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 10:24:13