有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JavaFX设置组合框会导致空指针

我有一个小gui,我在第一个组合框中选择一个项目,它用数据填充第二个组合框,并更改两个标签的文本

当我第一次选择第一个组合框(组合框\供应商),然后选择第二个组合框(组合框\无线电),并且它还更新了两个标签(标签\无线电\物质,标签\中场休息)时,一切正常。但是如果我再次尝试从第一个组合框中选择一个新选项,我会在日志中看到很多错误和空指针异常。(程序仍在继续运行)

错误日志相当长,但这一行可能是问题之一:

label_rad_substance.setText(newValue.getSubstance().getName());

代码如下:

package gui;

import java.net.URL;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Date;
import java.util.ResourceBundle;

import dao.RadiopharmaceuticalDao;
import dao.SupplierDao;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ComboBox;
import javafx.scene.control.DatePicker;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;
import model.Radiopharmaceutical;
import model.Room;
import model.Supplier;

public class Controller implements Initializable {

    private ObservableList<Supplier> supplierList = FXCollections.observableArrayList();
    private ObservableList<Radiopharmaceutical> radioList = FXCollections.observableArrayList();

    public DatePicker ankomstdatum = new DatePicker();
    public DatePicker kalibreringsdatum = new DatePicker();

    public ComboBox<Supplier> combobox_suppliers = new ComboBox<>();
    public ComboBox<Radiopharmaceutical> combobox_radio = new ComboBox<>();
    public ComboBox<Room> combobox_room = new ComboBox<>();

    public Label label_rad_substance = new Label();
    public Label label_halftime = new Label();

    public TextField text_kalibreringsaktivitet = new TextField();
    public TextField text_kalibreringstid = new TextField();
    public TextField text_batchnr = new TextField();
    public TextField text_kommentar = new TextField();
    public ListView<String> listView = new ListView<String>();

    public CheckBox check_kontamineringskontroll = new CheckBox();
    public Button button = new Button();



    public void addSuppliersToComboBox() {
        supplierList.addAll(new SupplierDao().getAll());
        combobox_suppliers.getItems().addAll(supplierList);
    }






    @Override
    public void initialize(URL location, ResourceBundle resources) {
        addSuppliersToComboBox();
        ankomstdatum.setValue(LocalDate.now());
        combobox_radio.setDisable(true);

        combobox_suppliers.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) ->{
            combobox_radio.getItems().clear();
            combobox_radio.getItems().addAll(FXCollections.observableArrayList(new RadiopharmaceuticalDao().getRadiopharmaceuticalsBySupplierName(newValue.toString())));
            combobox_radio.setDisable(false);
            combobox_radio.getSelectionModel().selectFirst();
        });

        combobox_radio.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue)->{
            label_rad_substance.setText(newValue.getSubstance().getName());
            label_halftime.setText(newValue.getSubstance().getHalfLife()+"");
        });
    }


}

共 (1) 个答案

  1. # 1 楼答案

    combobox_radio.getItems().clear();
    

    删除所有项目。不在items列表ComboBox中的项目没有资格被选择。由于这个原因,该语句导致所选的combo_radio项变成null,当试图在newValue.getSubstance()中取消对null的引用时,结果是NullPointerException

    你需要为null添加一个检查来解决这个问题,例如

    combobox_radio.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue)->{
        if (newValue == null) {
            label_rad_substance.setText("");
            label_halftime.setText("");
        } else {
            label_rad_substance.setText(newValue.getSubstance().getName());
            label_halftime.setText(newValue.getSubstance().getHalfLife()+"");
        }
    });
    

    顺便说一句:我不建议初始化注入的字段。如果这些字段被正确注入,那么您就创建了Node个从未使用过的字段。如果没有,最好立即得到一个异常,表明注入不起作用,而不是必须找出为什么对Node的某些更改不会影响GUI