JavaFX+MySQL搜索表单开发报错:NullPointerException求助
解决JavaFX搜索表单的NullPointerException问题
嘿,我一眼就看出问题所在啦!你遇到的java.lang.NullPointerException是因为控件还没初始化就调用了它的方法,具体原因和修复方案如下:
问题根源
在JavaFX中,@FXML标注的控件(比如你的fname1)是由FXML加载器在类实例化之后、initialize()方法执行之前完成注入的。但你现在把String firstName = fname1.getText();放在了类的成员变量声明位置,这时候fname1还没被实例化,还是null,调用getText()自然就触发空指针异常了。
另外还有两个小问题:
- 你的SQL语句里,
LIKE '%?%'的写法错误,占位符?不能放在引号里,否则会被当成普通字符串,无法正确替换参数。 - 代码里用到的
lname1没有声明@FXML注解,后续也会触发空指针。
修复后的完整代码
public class FilteredEmployees implements Initializable { @FXML private TextField fname1; @FXML private TextField lname1; // 补上这个@FXML注解 @FXML private TableView<Employee> table; @FXML private TableColumn<Employee,String> fname; public ObservableList<Employee> data = FXCollections.observableArrayList(); @Override public void initialize(URL location, ResourceBundle resources) { // 把获取文本的代码移到initialize方法里,此时控件已经完成注入 String firstName = fname1.getText(); String lastName = lname1.getText(); try{ // 修正SQL语句的LIKE写法 String sql = "SELECT * FROM `employee` WHERE (fname LIKE ?) or (name LIKE ?)"; Connection con = DBInfo.getConnection(); PreparedStatement preparedStatement = con.prepareStatement(sql); // 在参数里添加%,而不是写在SQL语句中 preparedStatement.setString(1, "%" + firstName + "%"); preparedStatement.setString(2, "%" + lastName + "%"); ResultSet rs = preparedStatement.executeQuery(); while(rs.next()){ data.add(new Employee(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getFloat(4), rs.getInt(5), rs.getString(6))); } // 记得把table和data绑定起来(你之前的代码里没写,补充上) table.setItems(data); con.close(); }catch(SQLException e){ e.printStackTrace(); } } }
额外提示
- 建议在使用数据库连接时用
try-with-resources语法,这样可以自动关闭连接、Statement和ResultSet,避免资源泄漏:try(Connection con = DBInfo.getConnection(); PreparedStatement preparedStatement = con.prepareStatement(sql)) { // 执行数据库操作 } catch(SQLException e) { e.printStackTrace(); } - 如果你的搜索表单是需要用户输入后点击按钮触发查询,那获取文本和数据库查询的逻辑应该放在按钮的点击事件处理器里,而不是
initialize()方法(initialize()是窗口加载时执行一次)。
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

