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

如何仅获取TableView中无空值的行存入数据库避免NullPointerException

问题分析

你当前的代码存在3个核心问题,导致无法正确过滤空行还容易抛出异常:

  • NPE风险:downtimeDetail.getTypeDT().getSelectionModel().getSelectedItem()可能直接返回null,此时直接调用toString()会直接触发空指针;getText()拿到空字符串时!=null判断不生效,后续转数字会报错
  • 过滤逻辑错误:最终判断是否加入列表用的是||逻辑,只要任意一个字段有值就会加入,完全不符合「所有必填字段非空才保存」的需求
  • 代码冗余:if/else分支里除了备注赋值逻辑完全一致,重复代码多维护性差
实现方案

先明确必填校验规则:停机类型下拉必须选中、停机时长和干预时长必须填写合法数字,备注可选,符合要求的行才加入保存列表,优化后的代码如下:

private void BtnSaveAction(ActionEvent event) {
    ObservableList<DowntimeDetail> list = TableDowntime.getItems();
    ArrayList<DowntimeDetail> validList = new ArrayList<>();
    String mat = Tx_Matricule.getText();
    boolean hasInvalidRow = false;

    for (DowntimeDetail detail : list) {
        // 第一步:先校验必填字段,全部符合才继续处理
        Object selectedType = detail.getTypeDT().getSelectionModel().getSelectedItem();
        String downTimeStr = detail.getDownTime().getText() == null ? "" : detail.getDownTime().getText().trim();
        String interventionTimeStr = detail.getInterventionTime().getText() == null ? "" : detail.getInterventionTime().getText().trim();

        // 必填字段全部非空才处理,否则跳过该行
        if (selectedType == null || downTimeStr.isEmpty() || interventionTimeStr.isEmpty()) {
            hasInvalidRow = true;
            continue;
        }

        // 第二步:处理数字转换,提前捕获格式错误
        int dtInt, itInt;
        try {
            dtInt = Integer.parseInt(downTimeStr);
            itInt = Integer.parseInt(interventionTimeStr);
        } catch (NumberFormatException e) {
            hasInvalidRow = true;
            continue;
        }
        if (dtInt <=0 || itInt <=0) {
            hasInvalidRow = true;
            continue;
        }

        // 第三步:统一赋值,仅备注分支区分
        String commentStr = detail.getComment().getText() == null ? "" : detail.getComment().getText().trim();
        detail.setTypeDtStr(selectedType.toString());
        detail.setDtInt(dtInt);
        detail.setItInt(itInt);
        detail.setCommentStr(commentStr);
        detail.setIdDTP(GetData.getIdDTProblem(detail));
        detail.setLqc(mat);

        // 加入有效列表
        validList.add(detail);
    }

    // 有无效行先提示
    if (hasInvalidRow) {
        LOutput.setStyle("-fx-text-fill:Red");
        LOutput.setText("存在未填/填写错误的必填字段,请修正后再提交");
        return;
    }
    if (validList.isEmpty()) {
        LOutput.setStyle("-fx-text-fill:Red");
        LOutput.setText("没有可保存的有效数据");
        return;
    }

    // 保存逻辑
    downtimeDetail.setDowntimes(validList);
    int result = GetData.saveDowntimes(downtimeDetail);
    if (result > 0) {
        LOutput.setStyle("-fx-text-fill:Green");
        LOutput.setText(result + " 条数据更新成功");
        Btn_Save.setDisable(true);
    } else {
        LOutput.setStyle("-fx-text-fill:Red");
        LOutput.setText("数据更新过程中发生错误");
        Btn_Save.setDisable(true);
    }
}
额外优化建议
  • 可以给TableView的单元格添加输入校验,用户输入时实时标红不符合要求的单元格,不用等到提交时才提示
  • 停机时长、干预时长的输入框使用TextFieldFormatter限制只能输入数字,避免后续转换抛出数字格式异常
  • 校验失败时可以标注具体第几行有问题,降低用户排查成本

内容的提问来源于stack exchange,提问作者Yassine El Moustachir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 12:18:03