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

如何捕获JavaFX可编辑Spinner抛出的NumberFormatException并提示用户

解决方案

这个异常是JavaFX默认的IntegerStringConverter对非数字输入没有做异常捕获导致的,你可以通过自定义带容错处理的字符串转换器来解决,同时可以在捕获异常时弹出提示告知用户:

步骤1:自定义带异常处理的Integer转换器

import javafx.util.converter.IntegerStringConverter;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.Spinner;

public class SafeIntegerConverter extends IntegerStringConverter {
    private final Spinner<Integer> spinner;
    // 存储上一次的合法值,输入非法时可以回滚
    private Integer lastValidValue;

    public SafeIntegerConverter(Spinner<Integer> spinner, Integer initialValue) {
        this.spinner = spinner;
        this.lastValidValue = initialValue;
    }

    @Override
    public Integer fromString(String s) {
        try {
            Integer value = super.fromString(s);
            // 额外匹配你设置的50-80的数值范围
            if (value >= 50 && value <= 80) {
                lastValidValue = value;
                return value;
            }
            throw new NumberFormatException("数值超出允许范围:50-80");
        } catch (NumberFormatException e) {
            // 弹出错误提示
            Alert alert = new Alert(AlertType.ERROR);
            alert.setTitle("输入错误");
            alert.setHeaderText("无效的数值输入");
            alert.setContentText("错误详情:" + e.getMessage() + "\n请输入50到80之间的整数");
            alert.showAndWait();
            // 回滚为上一次的合法值,避免输入框留空或保留非法内容
            spinner.getEditor().setText(lastValidValue.toString());
            return lastValidValue;
        }
    }
}

步骤2:给你的Spinner应用自定义转换器

Spinner<Integer> mySpin = new Spinner<Integer>(50, 80, 50);
mySpin.setEditable(true);
// 给Spinner的数值工厂设置自定义转换器即可生效
mySpin.getValueFactory().setConverter(new SafeIntegerConverter(mySpin, 50));

该方案会在用户输入非法字符、超出范围的数值时,立刻弹出对应错误提示,同时自动将输入框内容回滚为上一次的合法值,不会抛出未捕获的异常影响程序正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 23:18:01