For não funciona perfeitamente com variáveis globais

Gente, boa tarde a todos!

Eu não sei mais o que fazer, e preciso de uma ajuda. Estou criando um programa que gera relatórios com informações trazidas de uma base de dados do banco, mas eu não sei o que acontece, que o programa só retorna todos os valores se eu utilizar variáveis internas da função.
Qualquer variável externa inserida executa o loop apenas uma vez, e eu PRECISO utilizar as informações retornadas em outras finalidades.

Uma breve explicação do código:

*Existe uma base de dados, com duas colunas, “contagem” (que armazena um contador crescente) e “duração” (que armazena em string tempo cronometrado);

Existe um trecho de código em comentário. Esse trecho de código é o que funciona, somente com as variáveis internas. O trecho sem comentar, é o trecho que não funciona o loop perfeitamente

public void recuperaligacoes() {
/RECUPERA O REGISTRO DE LIGAÇÕES DA TABELA/

        recuperacontagem(); // traz o valor máximo da coluna "contagem"

        try {
            int cast, resultado = getResultado(), i, num = getResultado();
            String resultadotabela[] = new String[getResultado()];
            System.out.println("Contagem \t Tempo \n");
            /* for (i = 0, cast = 1; i <= num && cast <= resultado; i++, cast++) {

                String sql = "SELECT duracao from ligacao where contagem ='" + cast + "';";
                PreparedStatement stmt = connection.prepareStatement(sql);
                rs = stmt.executeQuery();
    
                while (rs.next()) {
                    resultadotabela[i] = rs.getString("duracao");
                    System.out.println(cast + "\t\t" + resultadotabela[i] + "\n");
                    stmt.close();
                }

            }*/

            for (cast = 1; cast <= resultado; cast++) {
                String sql = "SELECT duracao from ligacao where contagem ='" + cast + "';";
                PreparedStatement stmt = connection.prepareStatement(sql);
                rs = stmt.executeQuery();
                for (i = 0; i <= num; i++) {
                    while (rs.next()) {
                        resultadotabela[i] = rs.getString("duracao");
                        System.out.println(cast + "\t\t" + resultadotabela[i] + "\n");
                        stmt.close();
                    }
                    teste[i]=resultadotabela[i]; //variável teste é global, parametrizada com o campo "resultado", que traz o valor máximo da coluna "contagem"
                    System.out.println(teste[i]);
                }
            }

        } catch (Exception e) {

        }

    }

Por favor, alguém poderia me dar uma luz nesse problema, pois não sei mais o que fazer, nem como jogar o resultado para uso em outra função.

Obrigada desde já

tem 2 coisas erradas neste trecho,
1 - Você não precisa do for externo simplesmente declarar um int i=0 e dentro do While dar i++;
2 - stmt.close(); tem que ser chamado de fora do while, você esta mandando fechar a conexão repetidas vezes, sinceramente eu nem mesmo sei o que isso pode ocasionar.

Nunca faça um for de executeQuery(), você esta criando varias conexões seguidas, isso deixara o pc onde esta seu banco de dados lento e muito provavelmente ele não retornará resultado.

Você poderia substituir essa Query por
"SELECT duracao from ligacao where contagem Between 1 and " + resultado +" '; "

Haja coisa errada! hahaha

Eu arrumei esses pontos que você mencionou, e agora está muito melhor, obrigada! Mas ainda tenho problemas…

  • a String resultadotabela não é populada se declarada fora do try{
  • o sistema simplesmente ignora a string teste, e o s.o.p. dela

public void recuperaligacoes() {
//RECUPERA O REGISTRO DE LIGAÇÕES DA TABELA

    String resultadotabela[] = new String[getResultado()];
    recuperacontagem();

    try {
        int cast, resultado = getResultado(), i=0, num = getResultado();
        
        System.out.println("Contagem \t Tempo \n");

        do{
            String sql = "SELECT duracao from ligacao where contagem between 1 and'" + resultado + "';";
            PreparedStatement stmt = connection.prepareStatement(sql);
            rs = stmt.executeQuery();
            //for (i = 0; i <= num; i++) {
            
                while (rs.next()) {
                    resultadotabela[i] = rs.getString("duracao");
                    System.out.println(i + "\t\t" + resultadotabela[i] + "\n");
                    i++;
                    
                }
                
                
                teste[i]=resultadotabela[i];
                System.out.println(teste[i]);

                stmt.close();
           }while(i>resultado);
        //}

    } catch (Exception e) {

    }

}

Qual a necessidade desse do while?

NUNCA faças isto… Se ocorrer um erro não irás saber.

Bom, a ideia é executar um loop que preenche um vetor com o select do banco…rs

Está ruim?

pmlm, eu só coloquei assim pq:

  1. o programa me obrigou a colocar um catch;
  2. eu não sei o que colocar dentro desse catch…rs

É que você tem 2 laços um do-while mais externo e dentro dele tem um while que alimenta seu array.
Pra que serve o do-while externo?

Você está chamando o método getResultado() 3 vezes, o que esse método retorna?

Dá uma olhada se assim não atende sua necessidade:

// RECUPERA O REGISTRO DE LIGAÇÕES DA TABELA
public void recuperaligacoes() throws SQLException {
    int resultado = getResultado(); // o que esse método retorna? resultado do que?
    String resultadotabela[] = new String[resultado];
    recuperacontagem(); // o que esse método faz?
    System.out.println("Contagem \t Tempo \n");
    String sql = "SELECT duracao from ligacao where contagem between 1 and ? ";
    PreparedStatement stmt = connection.prepareStatement(sql);
    stmt.setInt(1, resultado);
    ResultSet rs = stmt.executeQuery();
    int i = 0;
    while (rs.next()) {
        resultadotabela[i] = rs.getString("duracao");
        System.out.println(i + "\t\t" + resultadotabela[i] + "\n");
        i++;
    }
    stmt.close();
}

Então… antes de ser um do-while, era um for…

Aí um membro da comunidade respondeu que estava abrindo mtas instâncias, e o ideal pro caso seria um do-while… foi o que eu fiz… hahaha

O getResultado() traz o resultado da leitura da query "“SELECT MAX(contagem) as contagem from ligacao;”;

Vou colocar o código aqui:

public int recuperacontagem() {

    Codigos co = new Codigos();
    String sql = "SELECT MAX(contagem) as contagem from ligacao;";

    try {
        PreparedStatement stmt = connection.prepareStatement(sql);
        rs = stmt.executeQuery();
        while (rs.next()) {

            setResultado(rs.getInt("contagem"));

            co.setContaparada(getResultado()); //contaparada pega o valor do resultado, e joga em outro método, que alimenta um contador automático
        }

    } catch (SQLException e) {

        //Saída de erro para o usuário.
        JOptionPane.showMessageDialog(null,
                "Houve um erro ao selecionar os dados!",
                "ERRO!",
                JOptionPane.ERROR_MESSAGE);

        //Saída de erro para o programador.
        System.out.println("ERRO:(LigacaoDAO.recuperacontagem)" + e.getMessage());
    }
    System.out.println("valor de resultado puxado da base: " + getResultado());
    //Retorna o resultado da execução SQL.

    try {
        if (getResultado() == 3) {
            sql = "DELETE from ligacao;";
            PreparedStatement stmt = connection.prepareStatement(sql);
            rs = stmt.executeQuery();;
            stmt.close();
        }

    } catch (SQLException e) {

        //Saída de erro para o usuário.
        JOptionPane.showMessageDialog(null,
                "Houve um erro ao selecionar os dados!",
                "ERRO!",
                JOptionPane.ERROR_MESSAGE);

        //Saída de erro para o programador.
        System.out.println("ERRO:(LigacaoDAO.limpeza)" + e.getMessage());
    }
    System.out.println("valor de resultado puxado da base: " + getResultado());
    //Retorna o resultado da execução SQL.{

    return resultado;

}

engraçado é que quanto mais olho, mais começo a achar que meu código está mais zoneado que o Bahamas…rs

Quando eu disse para não usar o FOR na verdade eu queria dizer para não usar uma estrutura de repetição.

Olha eu entendendo errado! hahaha

desculpa @Vinicius_Salles >.<

Outra coisa: tentei o seu código.

Deu o erro abaixo:

Exception in thread “AWT-EventQueue-0” java.lang.RuntimeException: Uncompilable source code - unreported exception java.sql.SQLException; must be caught or declared to be thrown

Que bom que percebeu, já é meio caminho pra melhorar.

O método recuperacontagem() já faz isso, qual a necessidade de ter um setResultado() e getResultado()?

Veja:

public String[] recuperaLigacoes() throws SQLException {
    int contagem = recuperaContagem();
    String ligacoes[] = new String[contagem];
    String sql = "SELECT duracao from ligacao where contagem between 1 and ? ";
    PreparedStatement stmt = connection.prepareStatement(sql);
    stmt.setInt(1, contagem);
    ResultSet rs = stmt.executeQuery();
    int i = 0;
    while (rs.next()) {
        ligacoes[i] = rs.getString("duracao");
        i++;
    }
    return ligacoes;
}

public int recuperaContagem() throws SQLException {
    int contagem = 0;
    String sql = "SELECT MAX(contagem) as contagem from ligacao;";
    PreparedStatement stmt = connection.prepareStatement(sql);
    ResultSet rs = stmt.executeQuery();
    if (rs.next()) {
        contagem = rs.getInt("contagem");
    }
    return contagem;
}

E porque se chama getResultado() e setResultado()

O método recuperacontagem() já faz isso, qual a necessidade de ter um setResultado() e getResultado()?

Pelo visto, nenhuma… haha Achei que era necessário, por conta de encapsulamento.

Que bom que percebeu, já é meio caminho pra melhorar.

Como se nota, eu sou meio crua em Java com BD…rs Já criei umas 8 versões do código todo, tentando buscar melhoria, mas sinto que em algumas coisas eu estou bem presa…rs

eu coloquei a codificação que vc publicou no meu tópico, e dá erro!

Eu não entendo pq, visto que é basicamente a mesma coisa, só que organizado, e fora de um try…catch.

Ele dá esse erro aqui
Exception in thread “AWT-EventQueue-0” java.lang.ArrayIndexOutOfBoundsException: 0

Pelo que li, esse erro acontece quando o array não tem parâmetro, mas os parâmetros estão setados!

Não to entendendo mais nada… :frowning:

Seu array está vazio, aí não tem como acessar a posição 0.
Da uma depurada no código.

eu olhei o código aqui, ele dá erro pq fica pedindo pra ser circundado com try-catch, que foi justamente o que saiu!

:woman_shrugging:t4:

É como é que aconteceu ArrayIndexOutOfBounds se seu código está com erro de compilação e nem executa?
Se executou, não tem erro de compilação.

Ele executa até o while, aí dá o erro de Array

public String[] recuperaLigacoes() throws SQLException {
    int contagem = recuperaContagem();
    String ligacoes[] = new String[contagem];
    String sql = "SELECT duracao from ligacao where contagem between 1 and ? ";
    PreparedStatement stmt = connection.prepareStatement(sql);
    stmt.setInt(1, contagem);
    ResultSet rs = stmt.executeQuery();
    int i = 0;
    while (rs.next()) {
        ligacoes[i] = rs.getString("duracao");
        i++;
    }
    return ligacoes;
}

Poderia então ser bug de compilador?