确实存在范围问题,因为
statement这里定义了一个本地方法变量:
protected void createContents() { ... Statement statement = null; // local variable ... btnInsert.addMouseListener(new MouseAdapter() { // anonymous inner class @Override public void mouseDown(MouseEvent e) { ... try { statement.executeUpdate(query); // local variable out of scope here } catch (SQLException e1) { e1.printStackTrace(); } ... });}当您尝试在
mouseDown()方法内部访问此变量时,您尝试从匿名内部类内部访问局部变量,并且作用域不够。因此,它肯定是
final(不可能给出您的代码)或声明为类成员,以便内部类可以访问此
statement变量。
怎么解决呢?
你可以…
使
statement一个类成员而不是一个局部变量:
public class A1 { // Note Java Code Convention, also class name should be meaningful private Statement statement; ...}你可以…
定义另一个最终变量,并使用该变量,如@HotLicks建议:
protected void createContents() { ... Statement statement = null; try { statement = connect.createStatement(); final Statement innerStatement = statement; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } ...}但是你应该…
重新考虑您的方法。如果在按下按钮
statement之前不使用变量,
btnInsert那么 在 实际发生 之前
创建连接是没有意义的。您可以这样使用所有局部变量:
btnInsert.addMouseListener(new MouseAdapter() { @Override public void mouseDown(MouseEvent e) { try {Class.forName("com.mysql.jdbc.Driver");try (Connection connect = DriverManager.getConnection(...); Statement statement = connect.createStatement()) { // execute the statement here} catch (SQLException ex) { ex.printStackTrace();} } catch (ClassNotFoundException ex) {e.printStackTrace(); }});


