令牌"<="上的语法错误,AssignmentOperator无效

Win*_*ter 0 java mysql

我正在尝试修复我很久以前为Craftbukkit写的一个插件,但我对一个部分感到难过.我搜索谷歌运气不好,我已经让其他Java开发人员听到我不应该使用for循环,因为它是相当基本的,或者我在错误的地方使用布尔表达式.没有人会告诉我如何解决这个问题,所以我知道将来的引用 - 下面是抛出错误的类:

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

我遇到的错误是在这部分代码中:

  for (; result.next(); i <= rsmd.getColumnCount())
  {
    rsmd = result.getMetaData();
    i = 1; continue;
    userInfo.put(rsmd.getColumnName(i), result.getObject(i));i++;
  }
Run Code Online (Sandbox Code Playgroud)

我收到错误"令牌上的语法错误"<=",无效的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;
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 6

基本上这是错误的方式:

for (; result.next(); i <= rsmd.getColumnCount())
Run Code Online (Sandbox Code Playgroud)

它应该有可能是:

for (; i <= rsmd.getColumnCount(); result.next())
Run Code Online (Sandbox Code Playgroud)

虽然更有可能,你真的想要:

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

话虽如此,你甚至没有初始化rsmd,这没有帮助.我怀疑你可能想打电话ResultSet.getMetadata(),比如说

rsmd = result.getMetadata();
Run Code Online (Sandbox Code Playgroud)

作为参考,for声明声明的三个部分如下:

  • 作为初始化,第一部分(在您的情况下为空)执行一次
  • 第二部分是检查每次迭代的条件; 当条件评估为时,循环结束false
  • 第三部分是声明是每次迭代结束时要采取的步骤

有关更多详细信息,请参阅JLS的第14.14.1节forJava教程语句部分.