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
而不是 equals
和 hashCode
中的其他字段,这意味着如果两个 Auth
具有相同的 uuid
他们将被视为平等。如果在对象 put
变成 HashMap
之后修改字段,那么包含其他字段会让您感到困惑。我认为这对您来说是最简单的方法,但要知道 equals
和 hashCode
中持久对象的确切内容是 subject of debate for some time.
出于某种奇怪的原因,我的哈希图总是返回一个空值,即使它不应该为空。该行在 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
而不是 equals
和 hashCode
中的其他字段,这意味着如果两个 Auth
具有相同的 uuid
他们将被视为平等。如果在对象 put
变成 HashMap
之后修改字段,那么包含其他字段会让您感到困惑。我认为这对您来说是最简单的方法,但要知道 equals
和 hashCode
中持久对象的确切内容是 subject of debate for some time.