首页 > 解决方案 > getter 和 setter 的问题

问题描述

我在使用 getter 和 setter 时遇到问题,因此我将对象列表设置在一个类用户对象列表中,并在第二类中使用 getter,当我运行调试器时,尽管当我设置 setter 时,getter 返回 Null第一个包含一个对象的类列表。我做错了什么?

public class Aplication extends Controller {
    private final Logger logger = Logger.getLogger(Main.class.getName());
    @FXML
    private ListView<String> contacts;
    @FXML
    private Label nameContact;
    @FXML
    private TextField myMessage;
    @FXML
    private TextArea Message;
    @FXML
    private Label limitText;
    @FXML
    private Label startowyLabel;



    private List<Users> contactList;
    private static Client client;
    public static boolean online = false;
    private final Stage win =Main.getWindow();
    public void pustaLista() {
        ObservableList<String> data = contacts.getItems();
        if (data.isEmpty()) {
            ObservableList<String> newData = FXCollections.observableArrayList("Kontakty są puste");
            contacts.setItems(newData);
        }
    }
    public static void close(){
        client.sendMessage(new ChatMessage(ChatMessage.LOGOUT, ""));
    }

    public List<Users> getContactList() {
        return contactList;
    }
    public void setContactList(List<Users> contactList) {
        this.contactList = contactList;
    }

    public void kontakty() {
        List<String> list;
        List<String> list2 = new ArrayList<>();
        Contacts contact = new Contacts(logintext);
        DBI db = new DB();

        try {
            Connection connection = DriverManager.getConnection(Constants.JDBC_URL, Constants.JDBC_USERNAME, Constants.JDBC_PASSWORD);
            list = db.readCon(connection, contact);
            for (String s : list) {
                Users user = new Users(s);
                list2.add(db.findUser(connection, user));
            }
            connection.close();
        } catch (SQLException e) {
            logger.log(Level.SEVERE, "Couldn't connect to database", e);
        }
        if (list2.isEmpty()) {
            pustaLista();
        } else {
            List<Users> users1 = new ArrayList<>();
            for(String s: list2){
                String[] res = s.split(" ");
                Users users = new Users();
                users.setNickname(logintext);
                users.setFistName(res[0]);
                users.setLastName(res[1]);
                users1.add(users);
                System.out.println(users.getLastName());
                setContactList(users1);
                System.out.println(users1.toString());
            }
            ObservableList<String> observableList = FXCollections.observableArrayList(list2);
            contacts.setItems(observableList);
        }


    }

    public void wyszukaj() throws IOException {
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(this.getClass().getResource("search.fxml"));
        Pane pane = loader.load();
        Scene scene = new Scene(pane);
        Stage stage = new Stage();
        stage.setScene(scene);
        stage.setTitle("Wyszukiwanie");
        stage.getIcons().clear();
        stage.getIcons().add(new Image(this.getClass().getResource("search.png").toString()));
        stage.show();
    }

    public void update() {
        int dl = myMessage.getText().length();
        limitText.setText(dl + "/1000");
    }
    void append(String mess){
        if(Message.getText() != null) {
            Message.setText(Message.getText() + mess);
        } else {
            Message.setText(mess);
        }
    }
    public String autor() {
        DBI db = new DB();
        String res = "";
        Users users = new Users(Controller.logintext);
        try {
            Connection connection = DriverManager.getConnection(Constants.JDBC_URL, Constants.JDBC_USERNAME, Constants.JDBC_PASSWORD);
            res = db.findUser(connection, users);
            connection.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return res;
    }
    public void createGroup() throws IOException {
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(this.getClass().getResource("groups.fxml"));
        Pane pane = loader.load();
        Scene scene = new Scene(pane);
        Stage stage = new Stage();
        stage.setScene(scene);
        stage.setTitle("Wybranie osób do grupy");
        stage.getIcons().clear();
        stage.getIcons().add(new Image(this.getClass().getResource("group.png").toString()));
        stage.show();
    }
    @FXML
    void initialize() {
        kontakty();
        client = new Client("localhost", 1500, autor(), this);
        win.setOnCloseRequest(e->{
            e.consume();
            Main.closeProgram();
        });
        if(!client.start())
            return;
        myMessage.setOnKeyPressed(e-> {
            if(e.getCode().equals(KeyCode.ENTER)){

                client.sendMessage(new ChatMessage(ChatMessage.MESSAGE, myMessage.getText()));
                myMessage.setText("");
            }
        });
        myMessage.setOnKeyReleased(e -> {
            if(e.getCode() != KeyCode.ENTER)
                update();
        });
        contacts.setOnMouseClicked(mouseEvent -> {
            nameContact.setVisible(true);
            myMessage.setVisible(true);
            Message.setVisible(true);
            limitText.setVisible(true);
            online = true;
            startowyLabel.setVisible(false);
            nameContact.setText(contacts.getSelectionModel().getSelectedItem());
            limitText.setText("0/1000");
        });
    }

}

一级

public class Groups extends Aplication{
    private final Logger logger = Logger.getLogger(Main.class.getName());

    public List<Users> getlC() {
        return lC;
    }

    public void setlC(List<Users> lC) {
        this.lC = lC;
    }

    @FXML
    private ListView<String> lv;
    private List<Users> lC;
    public void choise(){
        List<String> list = new ArrayList<>();
        for (Users users : getlC()) {
            list.add(users.getFistName() + " " + users.getLastName() + " " + users.getNickname());
        }
        System.out.println(lC.toString());
        System.out.println(list.toString());
        ObservableList<String> observableList = FXCollections.observableArrayList(list);
        lv.setItems(observableList);
    }
    @FXML
    void initialize(){
        List<Users> lU = getContactList();
        setlC(lU);
        choise();
    }
}

二班

 for(String s: list2){
                String[] res = s.split(" ");
                Users users = new Users();
                users.setNickname(logintext);
                users.setFistName(res[0]);
                users.setLastName(res[1]);
                users1.add(users);
                System.out.println(users.getLastName());
                setContactList(users1);
                System.out.println(users1.toString());
            }

通常在这里返回数据

 List<Users> lU = getContactList();

返回空指针

标签: java

解决方案


首先 - 我喜欢你的一些代码是英文的,有些是波兰语的。如果您曾与国际团队合作,这是一个非常糟糕的习惯,会让您大吃一惊。更不用说,如果他们不理解方法或变量名称,那么 SO 或其他地方的人会更难帮助您。

第二 - 为什么这两行:

setContactList(users1);
System.out.println(users1.toString());

在循环内?在循环完成后执行它们会更有意义。

最后 - 你的问题的根源。这种方法:

void initialize(){
    List<Users> lU = getContactList();
    setlC(lU);
    choise();
}

抛出NullPointerException,因为字段contactList实际上是空的。kontakty()该字段由 class中的方法初始化,该方法由同一类的方法Application调用。initialize()但是,这些方法都没有在 class 中的任何地方调用Groups

除非发生了一些我不知道的 JavaFX 魔术,否则initialize()类中的方法Groups应该是:

void initialize(){
       kontakty();
       List<Users> lU = getContactList();
       setlC(lU);
       choise();
    }

甚至可能:

void initialize(){
    super.initialize()
    List<Users> lU = getContactList();
    setlC(lU);
    choise();
}

如果您希望超类中的所有初始化代码也在子类中执行。


推荐阅读