JavaFX日历应用保存数据至TXT文件为空问题排查求助
JavaFX日历保存为空问题排查与修复
问题根源
- 数组存在未初始化的空元素:在
createCalendarGrid方法中,当row == 1 && col < 2时直接执行continue跳过了TextArea的创建,但对应的dayTextAreas[row-1][col](即第0行第0、1列)未被赋值,仍为null。 - 未捕获空指针异常导致流程终止:在
saveCalendarAsText方法中,遍历所有5行7列的TextArea时,遇到null的TextArea调用getText()会触发NullPointerException,而该异常不在catch (IOException)的捕获范围内,导致保存流程直接终止,文件未写入任何内容就被关闭,最终生成空文件。
修复方案
方案1:修改保存逻辑,跳过空元素
在保存时先判断TextArea是否为null,避免触发空指针异常,确保正常完成写入流程:
private void saveCalendarAsText(Stage mainStage) { FileChooser chooser = new FileChooser(); FileChooser.ExtensionFilter filter = new FileChooser.ExtensionFilter("Text files", "*.txt"); chooser.getExtensionFilters().add(filter); File file = chooser.showSaveDialog(mainStage); if (file == null) { return; // 用户取消了文件选择 } try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) { // 遍历所有文本区域,跳过未初始化的null对象 for (int row = 0; row < 5; row++) { for (int col = 0; col < 7; col++) { TextArea textArea = dayTextAreas[row][col]; if (textArea != null) { String dayData = textArea.getText().trim(); if (!dayData.isEmpty()) { writer.write(dayData + System.lineSeparator()); } } } } } catch (IOException error) { error.printStackTrace(); } }
方案2:初始化所有位置的TextArea(更健壮)
修改日历网格创建逻辑,确保数组中所有元素都被初始化,即使是不需要填充日期的空白区域:
private GridPane createCalendarGrid() { GridPane calendarGrid = new GridPane(); calendarGrid.setAlignment(Pos.CENTER); calendarGrid.setHgap(5); calendarGrid.setVgap(5); // 添加顶部月份标签 Label monthLabel = new Label("December 2023"); monthLabel.setStyle("-fx-font-size: 36; -fx-font-weight: bold;"); calendarGrid.add(monthLabel, 3, 0, 4, 1); // 跨4列 int dayNumber = 1; for (int row = 1; row < 6; row++) { for (int col = 0; col < 7; col++) { TextArea dayTextArea = new TextArea(); dayTextArea.setPrefRowCount(3); dayTextArea.setPrefColumnCount(12); dayTextArea.setEditable(true); dayTextArea.setWrapText(false); dayTextAreas[row - 1][col] = dayTextArea; if (dayNumber > 31 || (row == 1 && col < 2)) { // 超过31天或前两个位置,添加空白文本框 calendarGrid.add(dayTextArea, col, row); continue; } String dayOfWeek = calculateDayOfWeek(col + 1); String dayString = dayOfWeek + " the " + addOrdinalSuffix(dayNumber); dayTextArea.setText(dayString); calendarGrid.add(dayTextArea, col, row); dayNumber++; } } return calendarGrid; }
两种方案都能解决空文件问题,方案1改动小,方案2避免了数组中存在null元素的情况,代码更健壮。
内容的提问来源于stack exchange,提问作者nick_ort1z
相关产品推荐
相关产品推荐

