Java, varför får jag nullpointerexception?

Permalänk

Java, varför får jag nullpointerexception?

Jag håller på och trasslar med ett GUI som är skapat med JavaFX och försöker att få ordning på två st comboboxes. Efter att jag gjort ett val i den första comboboxen (combobox_suppliers) så fylls den andra comboboxen (combobox_radio) med data samt sätter ändrar värdet på två labels. (label_rad_substance, label_halftime).

När jag väljer först den ena comboboxen och sedan den andra så funkar allt. Men om jag sedan väljer något annat alternativ i den första komboboxen så får jag en massa errors i konsolen med bland annat nullpointerexceptions. Programmet funkar dock fortfarande och gör som det ska.

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); } public void addProductsToComboBox() { // if(!productsAdded) { // combobox_radio.setDisable(false); // productsAdded=true; // } // // radioList.clear(); // radioList.addAll(new RadiopharmaceuticalDao().getRadiopharmaceuticalsBySupplierName(combobox_suppliers.getValue().toString())); // combobox_radio.getItems().clear(); // combobox_radio.getItems().addAll(radioList); // combobox_radio.getSelectionModel().selectFirst(); // System.out.println(combobox_radio.getItems().size()); } public void ContaminationCheck(){ } public void disableElements() { } public String getCurrentDate() { DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); Date date = new Date(); return dateFormat.format(date); } @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(combobox_radio.getValue().getSubstance().getName()); label_halftime.setText(combobox_radio.getValue().getSubstance().getHalfLife()+""); }); } }

Permalänk
Medlem

På vilken rad får du NullPointerException? Det lär sig en hel del om varför du får det..

Edit: Min gissning är att det kommer på raden

label_rad_substance.setText(combobox_radio.getValue().getSubstance().getName());

När du byter värde i combobox_suppliers så kallar du combobox_radio.getItems().clear();. Om du då redan har ett värde i combobox_radio, så antar jag (har inte användt JavaFX på många år) att din listener på combobox_radio anropas (då värdet ändrar från det du hade tidigare till null). Eftersom combobox_radio.getValue() returnerar null, så får du NullPointerException då du försöker anropa getSubstance() på det.

Lösningen är då alltså att i listenern för combobox_radio först säkerställa att värdet inte är null.