如何仅获取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
相关产品推荐
相关产品推荐

