Java静态Connection方法引用外部变量报错 JavaFX项目SQL查询变量无法识别
问题解决方法
报错原因梳理
- 第一个
variable 'name' is not found报错:name是previous方法的局部变量,仅在方法执行期间有效,出了方法作用域就无法访问。 - 第二个
non-static variable test cannot be referenced from a static context报错:static修饰的方法属于类本身,不依赖类的实例对象,而test是控制器的实例成员,只有实例化后的对象才能访问,静态方法中无法直接引用非静态成员。
可行解决方案
核心思路是用控制器的实例成员变量存储前序窗口传递的参数,同时去掉不必要的static修饰符,避免静态上下文访问限制。
修改后的完整代码
package financials; import java.net.URL; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; import java.util.ResourceBundle; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.Label; import javax.swing.JOptionPane; public class theControl implements Initializable { @FXML private Label test; // 新增成员变量存储接收的编码参数 private String receivedCode; @Override public void initialize(URL url, ResourceBundle rb) { Statement st; Connection con = null; } public void previous(String name) { System.out.println(name); // 把接收的参数赋值给成员变量 this.receivedCode = name; // 如果需要界面显示就保留这行,不需要可以删掉 test.setText(name); } public static Connection ConnectDB() { try { Class.forName("com.mysql.cj.jdbc.Driver"); Connection con = DriverManager.getConnection("jdbc:mysql://localhost/database", "root", "Password"); return con; } catch(Exception ae) { JOptionPane.showMessageDialog(null, ae); return null; } } // 去掉static修饰符,改成实例方法 public ObservableList<RenderNow> getListAccount() { Connection con = ConnectDB(); ObservableList<RenderNow> list = FXCollections.observableArrayList(); // 先判断参数是否为空,避免SQL执行出错 if(receivedCode == null) { JOptionPane.showMessageDialog(null, "未获取到查询参数"); return list; } try { PreparedStatement pst = con.prepareStatement("SELECT * FROM lines WHERE Code=? "); // 直接使用成员变量赋值 pst.setString(1, receivedCode); ResultSet rs = pst.executeQuery(); while (rs.next()) { // 注意这里原来的SBRender要和你实际的实体类名对应,保持一致 list.add(new SBRender(rs.getString("Account1"), rs.getString("Account2"), rs.getString("Account3"), rs.getString("Account4"), rs.getString("Account5"))); } // 用完关闭资源,避免连接泄漏 rs.close(); pst.close(); con.close(); } catch(Exception ae) { JOptionPane.showMessageDialog(null, ae); return null; } return list; } }
关键修改说明
- 新增了私有成员变量
receivedCode,专门用来存储前序窗口传递的查询参数,不需要依赖UI组件存储业务数据,逻辑更清晰。 - 移除了
getListAccount方法的static修饰符,改为实例方法,就可以直接访问类的所有实例成员,包括我们新增的receivedCode和FXML注入的UI组件。 - 增加了参数非空校验,避免空参数传入SQL导致异常。
- 新增了数据库资源关闭逻辑,避免长时间运行后数据库连接占满的问题。
可选替代方案
如果不想修改getListAccount的静态属性,也可以直接给方法加参数,把查询编码作为入参传入:
public static ObservableList<RenderNow> getListAccount(String code) { // 内部直接用传入的code参数赋值给PreparedStatement即可 }
调用的时候直接把拿到的receivedCode传进去即可正常运行。
内容的提问来源于stack exchange,提问作者theboss12k
相关产品推荐
相关产品推荐

