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
相关产品推荐
相关产品推荐

