如何让XSSFWorkbook报错时弹出JavaFX警告对话框而非输出到终端
问题解决:JavaFX中Excel读取异常未触发Alert弹窗
问题根源
你当前的代码只捕获了IOException,但终端抛出的是POIXMLException(以及底层的XmlException),这些异常不属于IOException的子类,所以没有被catch块捕获,导致错误直接输出到终端,Alert弹窗不会触发。另外还需要考虑用户取消文件选择时selectedFile为null的情况,这会引发NullPointerException。
修改后的代码
protected void uploadNames() { try { FileChooser fileChooser = new FileChooser(); File selectedFile = fileChooser.showOpenDialog(stage); // 处理用户取消选择文件的情况 if (selectedFile == null) { return; } FileInputStream file = new FileInputStream(selectedFile); XSSFWorkbook workbook = new XSSFWorkbook(file); XSSFSheet spreadsheet = workbook.getSheetAt(0); for (int i = 0; i < spreadsheet.getLastRowNum(); i++) { TextField textField = new TextField(spreadsheet.getRow(i).getCell(0).toString()); textField.setEditable(false); namesList.getChildren().add(textField); arrayNamesList.add(textField); textField.setOnMousePressed(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { namesList.getChildren().remove(textField); arrayNamesList.remove(textField); } }); } // 关闭资源,避免内存泄漏 workbook.close(); file.close(); } catch (IOException e) { showErrorAlert("文件读取错误", "无法读取所选文件:" + e.getMessage()); } catch (POIXMLException e) { showErrorAlert("Excel格式错误", "所选文件不是有效的Excel文件:" + e.getMessage()); } catch (Exception e) { // 捕获其他未预料的异常 showErrorAlert("未知错误", "发生意外错误:" + e.getMessage()); } } // 提取Alert创建逻辑,复用代码 private void showErrorAlert(String title, String content) { Alert alert = new Alert(Alert.AlertType.ERROR); alert.setTitle(title); alert.setHeaderText(null); alert.setContentText(content); alert.showAndWait(); }
关键修改点
- 扩展异常捕获范围:新增
POIXMLException捕获(针对Excel格式错误),以及兜底的Exception捕获,确保所有异常都能被处理。 - 处理取消选择的情况:判断
selectedFile是否为null,避免空指针异常。 - 资源关闭:添加
workbook.close()和file.close(),释放文件资源。 - 复用Alert逻辑:将弹窗代码提取为单独方法,简化主代码,方便后续修改。
- 友好错误信息:在Alert中显示具体异常信息,帮助用户定位问题。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

