[RESOLVIDO] ResultSet fechado sem eu fechar ele

Tenho esse erro:

    [20:59:46 WARN]: java.sql.SQLException: ResultSet closed
    [20:59:46 WARN]:        at org.sqlite.RS.checkOpen(RS.java:63)
    [20:59:46 WARN]:        at org.sqlite.RS.findColumn(RS.java:108)
    [20:59:46 WARN]:        at org.sqlite.RS.getInt(RS.java:293)
    [20:59:46 WARN]:        at com.dreammissoes.dreamnetwork.dreammissoes.missoes.MissoesClass.getMineradorBlocosQuebrados(MissoesClass.java:14)
    [20:59:46 WARN]:        at com.dreammissoes.dreamnetwork.dreammissoes.commands.MissoesCommand.onCommand(MissoesCommand.java:42)
    [20:59:46 WARN]:        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44)
    [20:59:46 WARN]:        at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141)
    [20:59:46 WARN]:        at org.bukkit.craftbukkit.v1_8_R3.CraftServer.dispatchCommand(CraftServer.java:641)
    [20:59:46 WARN]:        at net.minecraft.server.v1_8_R3.PlayerConnection.handleCommand(PlayerConnection.java:1162)
    [20:59:46 WARN]:        at net.minecraft.server.v1_8_R3.PlayerConnection.a(PlayerConnection.java:997)
    [20:59:46 WARN]:        at net.minecraft.server.v1_8_R3.PacketPlayInChat.a(PacketPlayInChat.java:45)
    [20:59:46 WARN]:        at net.minecraft.server.v1_8_R3.PacketPlayInChat.a(PacketPlayInChat.java:1)
    [20:59:46 WARN]:        at net.minecraft.server.v1_8_R3.PlayerConnectionUtils$1.run(SourceFile:13)
    [20:59:46 WARN]:        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    [20:59:46 WARN]:        at java.util.concurrent.FutureTask.run(Unknown Source)
    [20:59:46 WARN]:        at net.minecraft.server.v1_8_R3.SystemUtils.a(SourceFile:44)
    [20:59:46 WARN]:        at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:715)
    [20:59:46 WARN]:        at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:374)
    [20:59:46 WARN]:        at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:654)
    [20:59:46 WARN]:        at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:557)
    [20:59:46 WARN]:        at java.lang.Thread.run(Unknown Source)

MissoesClass.java :

    package com.dreammissoes.dreamnetwork.dreammissoes.missoes;

    import java.sql.SQLException;

    import org.bukkit.entity.Player;

    import com.dreammissoes.dreamnetwork.dreammissoes.utils.SQliteConnector;

    public class MissoesClass {
    	
    	public static int getMineradorBlocosQuebrados(Player p) {
    		int i = 0;
    		try {
    			i += SQliteConnector.commandR("SELECT minerador FROM players WHERE uuid = '" + p.getUniqueId() + "';").getInt("minerador");
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		return i;
    	}
    	
    	public static boolean coletouMinerador(Player p) {
    		boolean b = false;
    		try {
    			int i = SQliteConnector.commandR("SELECT mineradorcoletado FROM players WHERE uuid = '" + p.getUniqueId() + "';").getInt("mineradorcoletado");
    			if(i == 0) {
    				b = false;
    			}
    			if(i == 1) {
    				b = true;
    			}
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		return b;
    	}
    	
    	public static void addBlocosMinerador(Player p, int quantidade) {
    		int blocosTotais = getMineradorBlocosQuebrados(p);
    		int blocos = blocosTotais + quantidade;
    		SQliteConnector.commandNR("UPDATE players SET minerador = " + blocos + " WHERE uuid = '" + p.getUniqueId() + "';");
    	}

    }

MissoesCommand.java :

    package com.dreammissoes.dreamnetwork.dreammissoes.commands;

    import java.util.ArrayList;

    import org.bukkit.Material;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandExecutor;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.inventory.meta.ItemMeta;

    import com.dreammissoes.dreamnetwork.dreammissoes.inventory.InventoryPlayer;
    import com.dreammissoes.dreamnetwork.dreammissoes.missoes.MissoesClass;
    import com.dreammissoes.dreamnetwork.dreammissoes.utils.Glow;

    public class MissoesCommand implements CommandExecutor {
    	
    	@Override
    	public boolean onCommand(CommandSender sender, Command cmd, String lbl, String[] args) {
    		
    		if(cmd.getName().equalsIgnoreCase("missoes")) {
    			if(sender instanceof Player) {
    				Player p = (Player) sender;
    				InventoryPlayer invP = new InventoryPlayer("Missões", 6*9);
    				ItemStack minerador = Glow.addGlow(new ItemStack(Material.DIAMOND_PICKAXE));
    				ItemMeta mineradorM = minerador.getItemMeta();
    				mineradorM.setDisplayName("§eMinerador");
    				ArrayList<String> mineradorL = new ArrayList<String>();
    				if(MissoesClass.coletouMinerador(p)) {
    					mineradorL.add("");
    					mineradorL.add(" §7Quebre 1000 blocos e");
    					mineradorL.add(" §7receba uma recompensa.");
    					mineradorL.add("");
    					mineradorL.add("§aColetado!");
    					mineradorL.add("");
    				} else {
    					mineradorL.add("");
    					mineradorL.add(" §7Quebre 1000 blocos e");
    					mineradorL.add(" §7receba uma recompensa.");
    					mineradorL.add("");
    					mineradorL.add("§e" + MissoesClass.getMineradorBlocosQuebrados(p) + "/1000");
    					mineradorL.add("");
    				}
    				mineradorM.setLore(mineradorL);
    				minerador.setItemMeta(mineradorM);
    				invP.addItem(0, minerador);
    				p.openInventory(invP.getInventory());
    			}
    		}
    		
    		return false;
    	}

    }

SQliteConnector.java :

    package com.dreammissoes.dreamnetwork.dreammissoes.utils;

    import java.io.File;
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;

    import com.dreammissoes.dreamnetwork.dreammissoes.Main;

    public class SQliteConnector {
    	
    	private static Connection con;
    	
    	public static void open() throws IOException, ClassNotFoundException, SQLException {
    		if(con != null) {
    			con = null;
    		} else {
    			File folder = new File(Main.getPlugin().getDataFolder().getAbsolutePath());
    			if(!folder.exists()) {
    				folder.mkdir();
    			}
    			File db = new File(folder, "quests.db");
    			if(!db.exists()) {
    				db.createNewFile();
    			}
    			String url = "jdbc:sqlite:" + db;
    			Class.forName("org.sqlite.JDBC");
    			con = DriverManager.getConnection(url);
    			//minerador, assassino, construtor, lenhador
    			//coletado
    			commandNR("CREATE TABLE IF NOT EXISTS players (uuid VARCHAR(30) PRIMARY KEY, minerador INTEGER, mineradorcoletado INTEGER, assassino INTEGER, assassinocoletado INTEGER, construtor INTEGER, construtorcoletado INTEGER, lenhador INTEGER, lenhadorcoletado INTEGER);");
    		}
    	}
    	
    	public static void close() throws SQLException {
    		if(con != null) {
    			con.close();
    		}
    	}
    	
    	public static void commandNR(String cmd) {
    		if(con != null) {
    			try {
    				PreparedStatement stm = con.prepareStatement(cmd);
    				stm.execute();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    	
    	public static ResultSet commandR(String cmd) throws SQLException {
    		ResultSet r = con.prepareStatement(cmd).executeQuery();
    		return r;
    	}
    	
    }

Basicamente o ResultSet closed n deixa eu pegar nada nas tabelas, e eu n fechei o ResultSet, quero sempre manter ele aberto.
Como eu resolvo esse erro?

Note: A ResultSet object is automatically closed by the Statement object that generated it when that Statement object is closed, re-executed, or is used to retrieve the next result from a sequence of multiple results.

Calling the method close on a ResultSet object that is already closed is a no-op.

Talvez isso seja o motivo. O correto é fechar imediatamente o resultset logo após ser usado.

FONTE: ResultSet.close()

Se chamar o connection.close();, não fecha tudo junto?

Não consegui acessar o link mas, o ResultSet ja começa fechado. Eu nem usei ele e ele já ta fechado

Sim, mas eu so uso o Connection.close() quando o plugin é desativado, para evitar erros

Porque fez tudo static?

O que tem nessa linha?

Porque não vou dar um new para MissoesClass

i += SQliteConnector.commandR("SELECT minerador FROM players WHERE uuid = '" + p.getUniqueId() + "';").getInt("minerador");

Não é um bom argumento para decidir fazer tudo static.

Tenta implementar seu código assim:

	public static int getMineradorBlocosQuebrados(Player p) {
		int i = 0;
		try {
		    ResultSet rs = SQliteConnector.commandR("SELECT minerador FROM players WHERE uuid = '" + p.getUniqueId() + "';");
            if (rs.next()) {
			    i += rs.getInt("minerador");
            }
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return i;
	}

Eu coloquei um else para o if(rs.next()) assim:

public static int getMineradorBlocosQuebrados(Player p) {
		int i = 0;
		try {
		    ResultSet rs = SQliteConnector.commandR("SELECT minerador FROM players WHERE uuid = '" + p.getUniqueId() + "';");
            if (rs.next()) {
			    i += rs.getInt("minerador");
            } else {
            	System.out.println("i = 0 :D");
            }
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return i;
	}

e o else está sendo executado, ou seja, rs.next() está com problemas

O next não está com problemas, é sua query que não traz resultados.

2 curtidas

Então, eu dei uma olhada mais profunda no projeto inteiro e percebi que tinha colocado nada na tabela.
Obrigado a todos que tentaram ajudar

1 curtida