我一直在尝试编写一个Java程序,它连接到mysql
db并从中检索数据。
我编写了一个成功运行的简单程序,但下面的代码片段引发了一些我甚至没有听说过的错误。
摘录如下:
public class test{
String rows,rows1;
String dbUrl = "jdbc:mysql://localhost:3306/login";
String dbClass = "com.mysql.jdbc.Driver";
public static void main(String args[]){
try{
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection (dbUrl,"root","");
Statement stmt = con.createStatement();
String query="select distinct(username) from tracking";
ResultSet rs=stmt.executeQuery(query);
while(rs.next())
{
rows=rs.getString("username");
System.out.println(rows);
String query1="select distinct(session_id) from tracking where username='"+rows+"'";
ResultSet rs1=stmt.executeQuery(query1);
while(rs1.next())
{
rows1=rs1.getString("session_id");
String query2="select * from tracking where username='"+rows+"' and session_id='"+rows1+"'";
ResultSet rs2=stmt.executeQuery(query2);
while(rs2.next())
{
System.out.println("Result"+rs2.getString("method"));
}
}
}
con.close();
}
catch(ClassNotFoundException e) {
e.printStackTrace();
}
catch(SQLException e) {
e.printStackTrace();
}
};
错误如下
test.java:12: error: non-static variable dbUrl cannot be referenced from a stati
c context
Connection con = DriverManager.getConnection (dbUrl,"root","");
^
test.java:19: error: non-static variable rows cannot be referenced from a static
context
rows=rs.getString("username");
^
test.java:20: error: non-static variable rows cannot be referenced from a static
context
System.out.println(rows);
^
test.java:21: error: non-static variable rows cannot be referenced from a static
context
String query1="select distinct(session_id) from tracking where username='"+rows+
"'";
^
test.java:25: error: non-static variable rows1 cannot be referenced from a stati
c context
rows1=rs1.getString("session_id");
^
test.java:26: error: non-static variable rows cannot be referenced from a static
context
String query2="select * from tracking where username='"+rows+"' and session_id='
"+rows1+"'";
^
test.java:26: error: non-static variable rows1 cannot be referenced from a stati
c context
String query2="select * from tracking where username='"+rows+"' and session_id='
"+rows1+"'";
我无法理解这里的错误。
答案 0 :(得分:1)
使你的变量成为STATIC。
static String rows,rows1;
static String dbUrl = "jdbc:mysql://localhost:3306/login";
static String dbClass = "com.mysql.jdbc.Driver";
您在MAIN方法中使用变量rows,rows1等是静态的。无论何时在静态方法中使用任何变量,变量本身都必须是静态的。
可能你正在制作common errors in Java之一。也许你可以通过其他类型的常见错误来避免它们。
答案 1 :(得分:1)
这里最简单的解决方案可能就是让变量保持静态:
static String rows,rows1;
static String dbUrl = "jdbc:mysql://localhost:3306/login";
static String dbClass = "com.mysql.jdbc.Driver";
或将它们移到main
内,假设您将坚持使用当前的“main
”策略中的所有内容。)
您遇到的问题是main
是一个静态类,因此在没有类实例的情况下运行。因此,它只能访问在类级别定义的成员(每个类一个,或者跨类所有实例的一个)。
因为您的四个字符串当前是实例变量(一个用于该类的每个实例),所以它们只能通过它们的实例引用。
以这种方式思考区别可能会有所帮助:
+-----------------------------------------------+
| xyzzy class |
| (class variables here, shared amongst |
| all instances and static methods) |
| |
| +------------------+ +------------------+ |
| | xyzzy instance 1 | | xyzzy instance 2 | |
| | (instance 1 | | (instance 2 | |
| | variables | | variables | |
| | here only | | here only | |
| | for this | | for this | |
| | instance) | | instance) | |
| +------------------+ +------------------+ |
| |
+-----------------------------------------------+
您根本不需要dbClass
,因为您实际上并未使用它。您应该在forName
调用中使用它,或者完全删除它。
答案 2 :(得分:0)
dbURL,dbClass,row和row1都应该是静态变量。
将它们声明为静态。
答案 3 :(得分:-2)
尝试在其遇到问题的变量前面弄乱“静态”,以便解释静态和非静态对象:this might help