HashMap 总是返回 null?

HashMap always returning null?

出于某种奇怪的原因,我的哈希图总是返回一个空值,即使它不应该为空。该行在 mysql 数据库中不为空。我没有收到任何错误信息,我进行了调试测试以查看它打印出的内容,并且它正在返回 null。

auth.java

private String uuid;
private String name;
private int bits;
private String gang;
private String rank;



public auth(String uuid, String name, int bits, String gang, String rank)
{
    this.uuid = uuid;
    this.name = name;
    this.bits = bits;
    this.gang = gang;
    this.rank = rank;
}

authmanager.java

public HashMap<String, auth> auth = new HashMap<>();



public void saveUser(String uuid, String name, int bits, String gang, String rank)
{

    this.auth.put(uuid, new auth(uuid, name, bits, gang, rank));

}

establishconnection.java

public void establishProfile(Player p){

    String UUID = p.getUniqueId().toString();
    String NAME = p.getName();

    try
    {


        ResultSet query = sql.querySQL("SELECT * FROM `profiles` WHERE `UUID`= '" + UUID + "';");

        PreparedStatement CREATE = c.prepareStatement("INSERT INTO `profiles` (`UUID`,`Name`, `Bits`, `Bans`, `Gang`, `Rank`) VALUES (?, ?, ?, ?, ?, ?) ");
        PreparedStatement LOAD = c.prepareStatement("SELECT * FROM `profiles` WHERE `UUID`= ?");

        if ( query.next() )
        {
            LOAD.setString(1, UUID);
            plugin.authmanager.saveUser(query.getString("UUID"), query.getString("Name"), query.getInt("Bits"), query.getString("Gang"), query.getString("Rank"));
            LOAD.close();
            query.close();
            p.sendMessage(tables.PROFILE_LOADED);
            Bukkit.getConsoleSender().sendMessage(ChatColor.GREEN + "[SQL]" +
                    " has loaded profile for " + NAME + "(" + UUID + ")"  );


        } else

        {
            CREATE.setString(1, UUID);
            CREATE.setString(2, NAME);
            CREATE.setInt(3, 0);
            CREATE.setInt(4, 0);
            CREATE.setString(5, null);
            CREATE.setString(6, "Default");

            CREATE.executeUpdate();
            CREATE.close();
            p.sendMessage(tables.PROFILE_CREATED);
            Bukkit.getConsoleSender().sendMessage(ChatColor.YELLOW + "[SQL]" +
                    " executed a new query for " + NAME + "(" + UUID + "}" +  plugin.authmanager.auth.get(0) );

        }


    }   catch (Exception e)

    {
        e.printStackTrace();

            Bukkit.broadcastMessage("Someone's profile has failed to load!\n ERROR: " + e);
    }

}

如果您将 auth 个对象粘贴到 HashMap 中,那么您需要 properly override equals and hashCode 在您的 auth class.

此外,您应该将 class 命名为 Auth 而不是 auth 以跟随 standard Java naming conventions。所以将auth.java重命名为Auth.java,定义如下(要求Java7或更高):

Auth.java

import java.util.Objects;

public class Auth {
    private String uuid;
    private String name;
    private int bits;
    private String gang;
    private String rank;

    public Auth() {
    }

    public Auth(String uuid, String name, int bits, String gang, String rank) {
        this.uuid = uuid;
        this.name = name;
        this.bits = bits;
        this.gang = gang;
        this.rank = rank;
    }

    public String getRank() {
        return rank;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (!(o instanceof Auth)) {
            return false;
        }
        Auth auth = (Auth) o;
        return Objects.equals(uuid, auth.uuid);
    }

    @Override
    public int hashCode() {
        return Objects.hash(uuid);
    }

    @Override
    public String toString() {
        return "Auth{" +
            "uuid='" + uuid + '\'' +
            ", name='" + name + '\'' +
            ", bits=" + bits +
            ", gang='" + gang + '\'' +
            ", rank='" + rank + '\'' +
            '}';
    }
}

我只包含 uuid 而不是 equalshashCode 中的其他字段,这意味着如果两个 Auth 具有相同的 uuid 他们将被视为平等。如果在对象 put 变成 HashMap 之后修改字段,那么包含其他字段会让您感到困惑。我认为这对您来说是最简单的方法,但要知道 equalshashCode 中持久对象的确切内容是 subject of debate for some time.