2015-08-17 3 views
-3

По какой-то нечетной причине мой хэш-файл всегда возвращает нулевое значение, даже если оно не должно быть нулевым. Строка не является нулевой в базе данных mysql. Я не получаю ошибку. Я проверил отладочный тест, чтобы увидеть, что он печатает, и он сохраняет значение null.HashMap всегда возвращает 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); 
    } 

} 
+0

где вы получаете сообщение об ошибке? Это в «this.auth.put (uuid, new auth (uuid, name, bits, gang, rank)); ?? –

+0

@ 2Hash Привет, как вы создали 'UUID' в объекте' Player'? –

ответ

0

Если you'r e наклеивая auth объектов в HashMap, тогда вам нужно properly override equals and hashCode в вашем классе auth.

Кроме того, вы должны назвать свой класс Auth вместо auth, чтобы следовать standard Java naming conventions. Так переименовать auth.java в Auth.java и определим его следующим образом (требуется Java 7 или выше):

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 + '\'' + 
      '}'; 
    } 
} 

I включены только uuid, а не другие поля в equals и hashCode, что означает что если у двух Auth s есть одинаковые uuid, они будут считаться равными. В том числе другие поля будут вас трогать, если вы измените поля после того, как объект был put в HashMap. Я думал, что это будет самый простой подход для вас, но знайте, что именно для equals и hashCode для постоянных объектов был subject of debate for some time.

+0

Не возражаете ли вы дать мне пример в моей ситуации? – 2Hash

+0

@ 2Hash Я добавил пример реализации 'Auth'. Кроме того, если вы найдете мой ответ достаточно, примите его. Благодаря! http://meta.stackexchange.com/a/23139/302176 – heenenee

+0

Как мне получить конкретное значение из hashmap? Как я мог бы просто вернуть «ранг» вместо всего? – 2Hash