确实存在范围问题,因为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 ; } });解决方法
尝试statemet.executeUpdate 在我的代码中执行时出现以下错误:
Local variable statement defined in an enclosing scope must be final or effectively final.
到目前为止,这是我的代码:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement;. import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; public class a1 { protected Shell shell; private Text text; private Text text_1; private Text text_2; private Text text_3; /** * Launch the application. * @param args */ public static void main(String[] args) { try { a1 window = new a1 ; window.open ; } catch (Exception e) { e.printStackTrace ; } } /** * Open the window. */ public void open { Display display = Display.getDefault ; createContents ; shell.open ; shell.layout ; while (!shell.isDisposed ) { if (!display.readAndDispatch ) { display.sleep ; } } } /** * Create contents of the window. */ protected void createContents { Connection connect = null; ResultSet resultSet = null; try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace ; } try { connect = DriverManager.getConnection("jdbc:mysql://localhost/railwaydb","root",""); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace ; } Statement statement = null; // statements allow to issue SQL queries to the database try { statement = connect.createStatement ; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace ; } shell = new Shell ; shell.setSize(450,300); shell.setText("SWT Application"); Label lblName = new Label(shell,SWT.NONE); lblName.setBounds(10,43,47,15); lblName.setText("Name"); Label lblFrom = new Label(shell,SWT.NONE); lblFrom.setBounds(10,74,55,15); lblFrom.setText("From"); Label lblTo = new Label(shell,SWT.NONE); lblTo.setBounds(10,105,15); lblTo.setText("To"); Label lblPrice = new Label(shell,SWT.NONE); lblPrice.setBounds(10,137,15); lblPrice.setText("Price"); text = new Text(shell,SWT.BORDER); text.setBounds(64,76,21); text_1 = new Text(shell,SWT.BORDER); text_1.setBounds(64,21); text_2 = new Text(shell,SWT.BORDER); text_2.setBounds(64,21); text_3 = new Text(shell,SWT.BORDER); text_3.setBounds(64,21); Label lblRailwayDatabase = new Label(shell,SWT.NONE); lblRailwayDatabase.setBounds(174,10,97,15); lblRailwayDatabase.setText("Railway Database"); Label lblCreateView = new Label(shell,SWT.NONE); lblCreateView.setBounds(189,15); lblCreateView.setText("Create View"); Button btnName = new Button(shell,SWT.CHECK); btnName.setBounds(189,73,93,16); btnName.setText("Name"); Button btnFrom = new Button(shell,SWT.CHECK); btnFrom.setBounds(189,16); btnFrom.setText("From"); Button btnTo = new Button(shell,SWT.CHECK); btnTo.setBounds(189,16); btnTo.setText("To"); Button btnPrice = new Button(shell,SWT.CHECK); btnPrice.setBounds(189,171,16); btnPrice.setText("Price"); Button btnInsert = new Button(shell,SWT.NONE); btnInsert.addMouseListener(new MouseAdapter { @Override public void mouseDown(MouseEvent e) { String name = text.getText ; String from = text_1.getText ; String to = text_2.getText ; String price = text_3.getText ; String query = "INSERT INTO booking (name,fromst,tost,price) VALUES ('"+name+"','"+from+"','"+to+"','"+price+"')"; try { statement.executeUpdate(query); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace ; } } }); btnInsert.setBounds(10,75,25); btnInsert.setText("Insert"); Button btnView = new Button(shell,SWT.NONE); btnView.setBounds(307,25); btnView.setText("View"); Button btnIndex = new Button(shell,SWT.NONE); btnIndex.setBounds(307,127,25); btnIndex.setText("Index"); } }
我也尝试设置statementfinal,但声明给了我另一个错误。
标签: #shell #addMouseListener #变量
评论列表