我正在尝试修复很久以前为 Craftbukkit 编写的插件, 但我对一个部分感到困惑。我在 Google 上搜索时运气不佳,我问过其他 Java 开发人员只是听说我不应该使用 for 循环,因为它相当基础,或者我在错误的地方使用了 boolean 表达式。没有人会告诉我如何我可以解决这个问题,所以我会知道以供将来引用 - 下面是引发错误的类:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Hashtable;
import java.util.logging.Logger;
import org.bukkit.configuration.file.FileConfiguration;
public class Database
{
private static String host = null;
private static String port = null;
private static String database = null;
private static String table = null;
private static String username = null;
private static String password = null;
private static String colUsername = null;
private static Logger logger = null;
public static void init(FileConfiguration config, Logger log)
{
logger = log;
host = config.getString("DBHost");
port = config.getString("DBPort");
database = config.getString("DBName");
table = config.getString("DBTable");
username = config.getString("DBUser");
password = config.getString("DBPass");
colUsername = config.getString("ColUsername");
}
public static Hashtable<String, Object> getUserInfo(String user)
{
String url = "jdbc:mysql://" + host + ":" + port + "/" + database;
String query = "SELECT * FROM " + table + " WHERE " + colUsername + " = ?";
Connection connect = null;
PreparedStatement stmt = null;
ResultSet result = null;
Hashtable<String, Object> userInfo = new Hashtable<String, Object>();
try
{
Class.forName("com.mysql.jdbc.Driver");
connect = DriverManager.getConnection(url, username, password);
stmt = connect.prepareStatement(query);
stmt.setString(1, user);
result = stmt.executeQuery();
ResultSetMetaData rsmd;
int i;
for (; result.next(); i <= rsmd.getColumnCount())
{
rsmd = result.getMetaData();
i = 1; continue;
userInfo.put(rsmd.getColumnName(i), result.getObject(i));i++;
}
return userInfo;
}
catch (ClassNotFoundException e)
{
logger.warning("Unable to load driver. Using default behaviour.");
e.printStackTrace();
}
catch (SQLException e)
{
logger.warning("Database error. Using default behaviour.");
e.printStackTrace();
}
finally
{
if (result != null) {
try
{
result.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
if (stmt != null) {
try
{
stmt.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
if (connect != null) {
try
{
connect.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
}
return null;
}
}
我遇到的错误是在这部分代码:
for (; result.next(); i <= rsmd.getColumnCount())
{
rsmd = result.getMetaData();
i = 1; continue;
userInfo.put(rsmd.getColumnName(i), result.getObject(i));i++;
}
我收到错误“ token 语法错误”<=,无效的 AssignmentOperator“
我应该如何解决这个问题,我该如何改进它?
编辑#1:
根据 Jon 的回答,这是我更新的代码:
try
{
Class.forName("com.mysql.jdbc.Driver");
connect = DriverManager.getConnection(url, username, password);
stmt = connect.prepareStatement(query);
stmt.setString(1, user);
result = stmt.executeQuery();
ResultSetMetaData rsmd = result.getMetaData();
while (result.next()) {
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
rsmd = result.getMetaData();
userInfo.put(rsmd.getColumnName(i), result.getObject(i));i++;
}
}
return userInfo;
}
最佳答案
基本上这是错误的方式:
for (; result.next(); i <= rsmd.getColumnCount())
它应该可能是:
for (; i <= rsmd.getColumnCount(); result.next())
尽管更有可能,您实际上想要:
while (result.next()) {
// This outer loop is executed once per row
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
// This inner loop is executed once per column (per row, as it's
// within the outer loop)
}
}
话虽如此,您甚至没有初始化 rsmd
,这无济于事。我怀疑你可能想调用 ResultSet.getMetadata()
,例如
rsmd = result.getMetadata();
供引用,for
语句声明的三部分如下:
- 第一部分(在您的情况下为空)执行一次,作为初始化
- 第二部分是检查每次迭代的条件;当条件评估为
false
时,循环结束
- 第三部分是声明是在每次迭代结束时要采取的步骤
参见 section 14.14.1 of the JLS或 for
statement part of the Java tutorial了解更多详情。
关于java - token "<="上的语法错误,无效的 AssignmentOperator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20204211/