ОК, у меня есть немного странный, вероятно, легко быть справедливым, но я работаю над приложением java fx с базой данных sql, подключенной через JDBC. все работает хорошо кроме одного. Когда вы нажимаете кнопку, сцена меняется, и данные извлекаются из базы данных, все это работает отлично, отладка показывает, что правильные значения такие, какими они должны быть, но когда я вызываю такой метод, как label1.setText(someString); он бросает NPE.
Итак, я запускаю отладку, все переменные выглядят хорошо. затем я делаю простую печать на самом узле, он печатает ноль, я думал, что инъекция fxml обработала создание экземпляра. Я проверил файлы fxml, у всех есть fx-id, и каждая вещь упоминается в классе. это, вероятно, что-то действительно глупое, что я упустил из виду.
это метод, который вызывает исключение, этот класс содержит запуск, основной, дескриптор и этот метод
public void insertData(ResultSet rsIn) {
try {
while (rsIn.next()) {
int housenumber = rsIn.getInt("housenumber");
String maintext = rsIn.getString("maintext");
String img1 = rsIn.getString("img1");
String img2 = rsIn.getString("img2");
String img3 = rsIn.getString("img3");
String img4 = rsIn.getString("img4");
// scrollLab is of Text type
scrollLab.setText(maintext);//here is where the NPE is thrown
}
} catch (SQLException sql) {
sql.printStackTrace();
}
}
другой класс содержит все методы, связанные с sql, и метод getStuff, из которого происходит rsIn результатов.
public void getstuff(String buttonid) {
switch (buttonid) {
case "winterfell":
try {
conn = DriverManager.getConnection(DB_URL, USER, PASS);
Statement stark = conn.createStatement();
System.out.println("Fetching records");
String sql = "SELECT * FROM houseinfo WHERE housenumber = 1";
rs = stark.executeQuery(sql);
GOT_Map map = new GOT_Map();
map.insertData(rs);
}catch(SQLException e){}
break;
и, наконец, метод дескриптора запускает процесс, это внутри класса контроллера того же класса, где возникает исключение
@Override
public void handle(ActionEvent event) {
Sql_handler sql = new Sql_handler();
try {
// will load the new scene for all map buttons but will pull data from the database to fill blanks
if (event.getSource() == winterfell) {
System.out.println("winterfell clicked");
//getting reference to the button's stage
Stage stageref = (Stage) winterfell.getScene().getWindow();
inforoot = FXMLLoader.load(getClass().getResource("infoView.fxml"));
stageref.setScene(scene2);
sql.getstuff("winterfell");
это, вероятно, простое исправление, которое я упускаю из виду, работая над этим без остановки последние два дня, любая помощь очень ценится
FXMLLoader
вводит поля, аннотированные@FXML
в контроллере. Вы не вызываетеinsertData()
на контроллере: вы вызываете его наmap
, который является объектом, который вы создали сами. Итак,map.scrollLab
равно нулю. - person James_D   schedule 30.04.2017getStuff()
. - person James_D   schedule 30.04.2017