2016-12-30 2 views
1

Wenn ich diesen Teil des Codes ausführen, gibt es mir eine SQLException. Alle MySQL-Informationen sind korrekt, genauso wie der Code, den ich genau in einer anderen Klasse verwendet habe, aber ich habe nur etwas anderes abgefragt und es hat gut funktioniert. HierSQLException Nach Ende der Ergebnismenge

ist der Stack-Trace

[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) 

Hier ist der Code

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; 
    } 

} 
} 

Antwort

2

Problem ist mit result.next() ;. Rufen Sie Ihre result.next() innerhalb der for Schleife als erste Anweisung auf und entfernen Sie den Methodenaufruf vor der for-Schleife. Und Sie können den Code wie folgt umgestalten.

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

Sieht aus wie Sie anrufen result.next() ein Zoll mehr als Sie sollten.

es ist immer besser, result.next() in while-Schleife zu setzen.

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

Der letzte Anruf funktioniert nicht wegen result.hasNext() nicht vorhanden. –

+0

Oh richtig! Ich nahm an, dass es eine hasNext-Methode hätte, aber es sollte genauso sein wie in der ersten while-Schleife. aktualisiert die Antwort –

+0

Eine weitere Sache aus Neugier, warum werden Sie zuerst zählen und dann Limit basierend auf zählen? Ich meine, wenn Sie direkt SELECT * FROM Tickets ORDER BY Date DESC LIMIT 5; Dies würden Sie nur 5 bekommen, wenn es mehr als 5 gibt und wenn es weniger als 5 gibt, werden Sie so viele bekommen. Es sieht für mich wie ein Overkill aus. Wenn es 2 Zeilen gibt und Sie Limit 5 setzen, erhalten Sie immer noch 2 rows. –