You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 23:47:57