Acesso a registros em um banco PostGre retornando 0 dados

Estou fazendo uma consulta a um banco de dados PostGre, em uma tabela que eu sei que (por enquanto) está com 16 dados. O problema é que meu ResultSet está voltando vazio… Tentei dar uma olhada nas outras postagens aqui no fórum e na internet, mas não consegui encontrar nada que resolvesse.

O acesso ao banco de dados é feito da seguinte maneira:

public static Connection getConnection() {
Connection connection = null;          //atributo do tipo Connection

try {
    // Carregando o JDBC Driver padrão
    String driverName = "org.postgresql.Driver";                        
    Class.forName(driverName);

    //Concatena a string de conexão em uma url
    String url = "jdbc:postgresql://"+sServer+":"+sPort+"/"+sDatabase;

    //Solicita conexão com o banco de dados
    connection = DriverManager.getConnection(url, sUser, sPassword);
    //Testa sua conexão//  
    if (connection != null) {
        status = ("Connected");
    } else {
        status = ("Disconnected");
    }
    
    return connection;
    
} catch (    ClassNotFoundException | SQLException e) {
    status = (e.getMessage());
    return null;
}
}

e a query de consulta ao banco de dados pode ser vista abaixo:

public static String[][] listRawStudent()
{
    //Gera array de retorno
    String[][] returnArray;
    try
    {
        //Conecta com o banco de dados
        Connection conn;
        conn = clDataBase.getConnection();
        //Cria statement e a string de conexão
        Statement stmt = conn.createStatement();
        //Inicia ResultSet
        ResultSet rs;
        rs = stmt.executeQuery("select guest_id, guest_name from guest");
        //Para poder iniciar o array de retorno, move o ponteiro do
        //ResultSet para o final
        rs.last();
        //Pega o valor da última linha
        int linhas = rs.getRow();
        //Inicializa a variável de retorno
        returnArray = new String[16][2];
        //Retorna o ponteiro para o início
        rs.first();
        //Inicializa um contador
        int contador = 0;
        while(rs.next()) //enquanto existe uma proxima linha
        {
            //Adiciona dados para o array
            returnArray[contador][0] = rs.getString("id");
            returnArray[contador][1] = rs.getString("name");
            contador ++;
        }
    }
    catch(SQLException e)
    {
        status = (e.getMessage());
        returnArray = new String[0][0];
    }
    //Fecha a conexão
    closeConexao();        
    return returnArray;
}

O array de retorno volta null em todas as consultas… Por sua vez, o erro retornado pelo Java é o seguinte:

Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 1
at testcampus.TestCampus.main(TestCampus.java:21)
C:\Users\tiago\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
FALHA NA CONSTRUÇÃO (tempo total: 2 segundos)

Alguma ideia ou sugestão sobre o que está ocorrendo?

Bom pela stack de erro, a matriz de 16x2 não está comportando os dados da consulta, quantos registros em média existem na tabela?

Você pode tornar o tamanho das linhas da matriz dinâmico assim:

...
returnArray = new String[linhas][2];
...

Veja se o erro persiste?

Outra dica: evite usar Statement, pesquise sobre PreparedStatement…

Obs: cuidado com isso

rs.getString("id")

Pode ocasionar outros erros, já que na consulta o nome é guest_id, guest_name, etc… procurre deixar da mesma forma no getString…

Então, eu estava usando o parâmetro linhas para dar o tamanho da Array (até por isso eu calculava o tamanho do retorno).

Mesmo fazendo as alterações sugeridas, continuo com retorno de uma matriz [0][0]…

Fiz as alterações que me você me sugeriu:

 //Método pra listar os dados brutos dos estudantes
public static String[][] listRawStudent()
{
//Gera array de retorno
String[][] returnArray;
try
{
	//Conecta com o banco de dados
	Connection conn = clDataBase.getConnection();
	//Cria string de pesquisa
	String tsql = "select guest_id, guest_name from guest";
	//Cria statement e a string de conexão
	PreparedStatement stmt = conn.prepareStatement(tsql);
	//Inicia ResultSet
	ResultSet rs = stmt.executeQuery();
	//Para poder iniciar o array de retorno, move o ponteiro do
	//ResultSet para o final
	rs.last();
	//Pega o valor da última linha
	int linhas = rs.getRow();
	//Inicializa a variável de retorno
	returnArray = new String[linhas][2];
	//Retorna o ponteiro para o início
	rs.first();
	//Inicializa um contador
	int contador = 0;
	while(rs.next()) //enquanto existe uma proxima linha
	{
		//Adiciona dados para o array
		returnArray[contador][0] = rs.getString("guest_id");
		returnArray[contador][1] = rs.getString("guest_name");
		contador ++;
	}
}
catch(SQLException e)
{
	status = (e.getMessage());
	returnArray = new String[0][0];
}
//Fecha a conexão
closeConexao();        
return returnArray;
}

Rodando a mesma query dentro do PostGre, tenho um retorno normal e com todos os registros.

Quando da alguma exceção, vc retorna uma matriz “vazia”. Ou vc trata este retorno lá onde vc chamou o método, ou usa melhor o tratamento de exceção, retornando uma exceção pra cima com throw.
E adiciona um e.printStackTrace() no seu catch para ver oque está acontecendo.

Você tinha toda razão, Rodrigo.

De fato, o problema é que o ResultSet não era rolável. Esse erro estava indo para o status e eu não estava tratando.

Erro encontrado e corrigido (transformei o resultset em rolável).

Por fim, ficou da seguinte maneira

//Método pra listar os dados brutos dos estudantes
public static String[][] listRawStudent()
{
    //Gera array de retorno
    String[][] returnArray;
    try
    {
        //Conecta com o banco de dados
        Connection conn = clDataBase.getConnection();
        //Cria string de pesquisa
        String tsql = "select guest_id, guest_name from guest "
                + "order by guest_id asc";
        //Cria statement e a string de conexão
        Statement stmt = conn.createStatement(
                ResultSet.TYPE_SCROLL_SENSITIVE, 
                ResultSet.CONCUR_READ_ONLY);
        //Inicia ResultSet
        ResultSet rs = stmt.executeQuery(tsql);
        //Para poder iniciar o array de retorno, move o ponteiro do
        //ResultSet para o final
        rs.last();
        //Pega o valor da última linha
        int linhas = rs.getRow();
        //Inicializa a variável de retorno
        returnArray = new String[linhas][2];
        //Retorna o ponteiro para o início
        rs.first();
        //Inicializa um contador
        int contador = 0;
        while(rs.next()) //enquanto existe uma proxima linha
        {
            //Adiciona dados para o array
            returnArray[contador][0] = rs.getString("guest_id");
            returnArray[contador][1] = rs.getString("guest_name");
            contador ++;
        }
    }
    catch(SQLException e)
    {
        status = (e.getMessage());
        returnArray = new String[0][0];
    }
    //Fecha a conexão
    closeConexao();        
    return returnArray;
}