2016-12-30 4 views
1

Когда я запускаю эту часть кода, она дает мне SQLException. Вся информация MySQL верна, а также код, который я использовал точно в другом классе, но просто запрашивал что-то еще, и он работал нормально.SQLException После завершения набора результатов

Вот трассировки стека

[23:24:06 WARN]: java.sql.SQLException: After end of result set 
[23:24:06 WARN]:  at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:963) 
[23:24:06 WARN]:  at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:896) 
[23:24:06 WARN]:  at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:885) 
[23:24:06 WARN]:  at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860) 
[23:24:06 WARN]:  at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:790) 
[23:24:06 WARN]:  at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2472) 
[23:24:06 WARN]:  at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2583) 
[23:24:06 WARN]:  at me.Austin.MT.RecentTickets.recentTickets(RecentTickets.java:47) 
[23:24:06 WARN]:  at me.Austin.MT.GUIs.AdminGUIManager.onInvClick(AdminGUIManager.java:94) 
[23:24:06 WARN]:  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
[23:24:06 WARN]:  at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
[23:24:06 WARN]:  at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
[23:24:06 WARN]:  at java.lang.reflect.Method.invoke(Unknown Source) 
[23:24:06 WARN]:  at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302) 
[23:24:06 WARN]:  at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) 
[23:24:06 WARN]:  at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:502) 
[23:24:06 WARN]:  at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:487) 
[23:24:06 WARN]:  at net.minecraft.server.v1_11_R1.PlayerConnection.a(PlayerConnection.java:1844) 
[23:24:06 WARN]:  at net.minecraft.server.v1_11_R1.PacketPlayInWindowClick.a(SourceFile:33) 
[23:24:06 WARN]:  at net.minecraft.server.v1_11_R1.PacketPlayInWindowClick.a(SourceFile:10) 
[23:24:06 WARN]:  at net.minecraft.server.v1_11_R1.PlayerConnectionUtils$1.run(SourceFile:13) 
[23:24:06 WARN]:  at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) 
[23:24:06 WARN]:  at java.util.concurrent.FutureTask.run(Unknown Source) 
[23:24:06 WARN]:  at net.minecraft.server.v1_11_R1.SystemUtils.a(SourceFile:46) 
[23:24:06 WARN]:  at net.minecraft.server.v1_11_R1.MinecraftServer.D(MinecraftServer.java:739) 
[23:24:06 WARN]:  at net.minecraft.server.v1_11_R1.DedicatedServer.D(DedicatedServer.java:399) 
[23:24:06 WARN]:  at net.minecraft.server.v1_11_R1.MinecraftServer.C(MinecraftServer.java:675) 
[23:24:06 WARN]:  at net.minecraft.server.v1_11_R1.MinecraftServer.run(MinecraftServer.java:574) 
[23:24:06 WARN]:  at java.lang.Thread.run(Unknown Source) 

Вот код

public class RecentTickets { 

public static HashMap<Integer, String> rTickets = new HashMap<>(); 
/* 
* TODO: Return the most 5 recent 
* 
* 
*/ 

/** 
* RecentTickers Class - Returns the recent tickets 
* 
* @param p Player that runs the command 
* @return The 5 most recent tickets 
* @throws SQLException Just in case MySQL wants to be a dick 
*/ 
public static HashMap<Integer, String> recentTickets(Player p) throws SQLException { 
    rTickets.clear(); 
    int t = 0; 
    Statement statement = MySQL.getConnection().createStatement(); 
    ResultSet r2 = statement 
      .executeQuery("SELECT COUNT(*) FROM tickets ORDER BY Date DESC;"); 
    while (r2.next()) { 
     t = r2.getInt(1); 
    } 
    if (t > 5) { 
     ResultSet result = statement.executeQuery("SELECT * FROM tickets ORDER BY Date DESC LIMIT 5;"); 
     result.next(); 

     int i; 
     for (i = 0; i < t; i++) { 
      rTickets.put(result.getInt("TicketID"), result.getString("UUID")); 
      result.next(); 
     } 
     return rTickets; 
    } else { 
     ResultSet result = statement.executeQuery(
       "SELECT * FROM tickets ORDER BY Date DESC LIMIT " + t + ";"); 
     result.next(); 

     int i; 
     for (i = 0; i < t; i++) { 
      rTickets.put(result.getInt("TicketID"), result.getString("UUID")); 
      result.next(); 
     } 

     return rTickets; 
    } 

} 
} 

ответ

2

Проблема с результатом.next() ;. Вызовите ваш result.next() внутри для цикла как первый оператор и удалите цикл метода before for. И вы можете реорганизовать код, как показано ниже.

public static HashMap<Integer, String> recentTickets(Player p) throws SQLException { 
    rTickets.clear(); 
    int t = 0; 
    Statement statement = MySQL.getConnection().createStatement(); 
    ResultSet r2 = statement 
     .executeQuery("SELECT COUNT(*) FROM tickets ORDER BY Date DESC;"); 
    while (r2.next()) { 
     t = r2.getInt(1); 
    } 
    if(t>5){ 
     t=5; 
    } 

    ResultSet result = statement.executeQuery(
      "SELECT * FROM tickets ORDER BY Date DESC LIMIT " + t + ";"); 

     for (int i = 0; i < t; i++) { 
      result.next(); 
      rTickets.put(result.getInt("TicketID"), result.getString("UUID")); 

     } 
     return rTickets;   
} 
1

Похоже, вы вызываете result.next() дюйм больше, чем нужно.

всегда лучше поставить result.next() в цикл while.

public static HashMap<Integer, String> recentTickets(Player p) throws SQLException { 
    rTickets.clear(); 
    int t = 0; 
    Statement statement = MySQL.getConnection().createStatement(); 
    ResultSet r2 = statement 
      .executeQuery("SELECT COUNT(*) FROM tickets ORDER BY Date DESC;"); 
    while (r2.next()) { 
     t = r2.getInt(1); 
    } 
    ResultSet result; 
    if (t > 5) { 
     result = statement.executeQuery("SELECT * FROM tickets ORDER BY Date DESC LIMIT 5;"); 

    } else { 
     result = statement.executeQuery(
       "SELECT * FROM tickets ORDER BY Date DESC LIMIT " + t + ";"); 
    } 
    if(result == null){ 
    return rTickets; 
    } 
    while(result.next()){ 
      rTickets.put(result.getInt("TicketID"), result.getString("UUID")); 
    } 
     return rTickets; 
} 
} 
+0

Последнее, когда вызов не работает из-за result.hasNext() не существует. –

+0

О, верно! Я предположил, что у него будет метод hasNext, но он должен быть таким же, как в первом цикле while. обновил ответ –

+0

Еще одна вещь из любопытства, почему вы сначала получаете счет, а затем устанавливаете лимит на основе счета? Я имею в виду, если вы непосредственно запускаете SELECT * FROM билеты ORDER BY Date DESC LIMIT 5; это вы получите всего 5, если их будет больше 5, и если их будет меньше 5, вы получите столько. Для меня это выглядит излишним. Если есть 2 строки, и вы устанавливаете предел 5, все равно вы получите только 2 rowss. –