Java开发货币转换器时combobox选中索引对比触发空指针异常如何解决
问题根本原因
- 你声明的
indexFirstCombobox、indexSecondCombobox是Integer包装类型的类成员变量,初始化时没有赋值,默认值为null - 这两个变量只有触发
firstCombobox的选择事件时才会被赋值,如果用户进入界面后没有操作过第一个下拉框,直接点击换算按钮(也就是secondButton),进入e.getSource() == secondButton的分支时,两个索引变量还是null - 执行
if (indexFirstCombobox == indexSecondCombobox)判断时,包装类Integer会自动拆箱为基础类型int,对null执行拆箱操作就会抛出你遇到的空指针异常。
解决方案
方案1:初始化时给索引变量赋默认值
声明变量时直接给初始值,避免空值:
// 类成员变量声明处直接赋值,默认选中第0项就给0,无选中状态可以给-1 private Integer indexFirstCombobox = -1; private Integer indexSecondCombobox = -1;
方案2:点击换算按钮时实时读取下拉框选中值
不要把索引变量存成全局的,每次点换算的时候直接读下拉框的当前值,彻底避免变量赋值时机不对的问题,这个方案稳定性最高:
if (e.getSource() == secondButton) { // 每次点击都实时获取最新的选中索引,不用等下拉框触发事件才赋值 int indexFirstCombobox = firstCombobox.getSelectedIndex(); int indexSecondCombobox = secondCombobox.getSelectedIndex(); String stringTextField = firstTextField.getText(); int integerTextField = Integer.parseInt(stringTextField); if (indexFirstCombobox == indexSecondCombobox) { if (indexFirstCombobox == 0) { System.out.println(integerTextField + " Euros are " + integerTextField + " Euros"); } // 其余币种相同时的逻辑补充在这里 } }
方案3:判断前先做空值校验
如果一定要保留全局变量的写法,判断前先检查是否为空:
if (indexFirstCombobox != null && indexSecondCombobox != null && indexFirstCombobox == indexSecondCombobox) { if (indexFirstCombobox == 0) { // 业务逻辑 } }
额外优化提示
- 你代码中
firstCombobox.getSelectedIndex();、firstCombobox.getSelectedItem();这类没有接收返回值的语句是无效代码,可以直接删除 - 读取输入框内容转整数时建议加异常捕获,避免用户输入非数字内容导致程序崩溃。
内容的提问来源于stack exchange,提问作者jakob
相关产品推荐
相关产品推荐

