java - token "<="上的语法错误,无效的 AssignmentOperator

标签 java mysql

我正在尝试修复很久以前为 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 JLSfor statement part of the Java tutorial了解更多详情。

关于java - token "<="上的语法错误,无效的 AssignmentOperator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20204211/

相关文章:

java - 制作带有多个圆圈的进度条

java - jackson 无法识别@JsonCreator 注释

java - 如何使用java代码(不是xml)在Textview中将可绘制的左图标设计为圆形(使用setCompoundDrawablesWithIntrinsicBounds添加)

php - 保持变量在函数之间保持不变

php mysql从json中的多个表中获取数据

php - 时间表报警通知系统php

java - 捕捉雨水高度是数组

java - 如何修复 Java Applet 的代码太大错误?

MySQL:服务已关闭 || Zabbix 代理 ubuntu

mysql - MySQL如何选择一列并减去该列的最小数