确实存在范围问题,因为statement这里定义了一个本地方法变量:
protected void createContents() { ... Statement statement = null; // local variable ... btnInsert.addMouseListener(new MouseAdapter() { // anonymous inner class@Overridepublic 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 blocke.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 databasetry { 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,但声明给了我另一个错误。