如何解决局部变量范围问题怎么解决呢?
确实存在范围问题,因为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");
}
}
我也尝试设置statement
final,但声明给了我另一个错误。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。