Pq. Arraylist está perdendo uma posição?

Pessoal… mais uma vez preciso dee ajuda.

Estou usando um Arraylist que guarda o resultado de um select randômico de 20 posições.

O problema é… ele sempre perde 1 posição.

O Banco possui 30 perguntas, ele traz sempre 19 ( o limit é 20 )

Olhem o código…

String url="jdbc:mysql://ip:porta/banco";
        Connection con;
        Statement stmt;
            
        try {
                Class.forName("com.mysql.jdbc.Driver");  // localizando o Driver de Conexão
            }
     
            
        catch (java.lang.ClassNotFoundException e) {
                System.err.print("ClassNotFoundException: ");  // tratamento de erro da conexão
                System.err.println(e.getMessage());
            }

// Bloco de conexão e análise

        try {            
                
            con = DriverManager.getConnection (url, "root","");
            con.setAutoCommit(false);
            
            String sql = "select * from tb_dados where cat = 'manager' order by rand() limit 20;";
            PreparedStatement p = con.prepareStatement(sql);
            
            ResultSet rs = p.executeQuery(sql); // executando comando no mysql.]
                        
            if (!rs.next()) // verifica se o resultado foi encontrado
            {
                JOptionPane.showMessageDialog(null,"Não existem questões para o Módulo Selecionado.","Erro de Processamento",JOptionPane.INFORMATION_MESSAGE);
             }
                
            else {
               
                while(rs.next()){
                         
                    lista.add(rs.getString("p"));
                    lista.add(rs.getString("rp1"));
                    lista.add(rs.getString("rp2"));
                    lista.add(rs.getString("rp3"));
                    lista.add(rs.getString("rp4"));
                    lista.add(rs.getString("rp5"));
                    lista.add(rs.getString("rpc"));
                    
                }
                
                for (Iterator it = lista.iterator();it.hasNext();){
                        System.out.println(it.next());
                }
            }

            p.close();    // Fechando conexão
            con.close();
        }
            
        catch(SQLException ex) {
            System.err.print("SQLException: ");  // tratamento de erros do bloco ded conexão e análise.
            System.err.println(ex.getMessage());
        }
        
        txt_pergunta.setText(lista.get(0).toString());
        txt_r1.setText(lista.get(1).toString());
        txt_r2.setText(lista.get(2).toString());
        txt_r3.setText(lista.get(3).toString());
        txt_r4.setText(lista.get(4).toString());
        txt_r5.setText(lista.get(5).toString());

Esta parte ele simplesmente exibe as 6 primeiras posições… Quando clico no confirmar, ele retira essas 6 posições e exibe outras 6. Tb postei o código.


if (op1.isSelected()){
            conf = "A";
        }
        else
            if (op2.isSelected()){
                conf = "B";
            }
            else
                if(op3.isSelected()){
                    conf = "C";
                }
                else
                    if (op4.isSelected()){
                        conf = "D";
                    }
                    else
                        if (op5.isSelected()){
                            conf = "E";
                        }
        
        if (lista.get(6).toString().equals(conf)){
            nt = nt + 0.5;
        }
        
        int c=0;
            
        do{
           lista.remove(0);
           c++;
        }while(c<=6);
        
        bt_next.setEnabled(true);
        bt_confirma.setEnabled(false);

Não entendi, ele não deveria exibir as 6 primeiras posições, excluir as 6 primeiras, e tornar a exibir as próximas 6. Pra isso, utilizo outrto trecho de código, q está funcionando perfeitamente.

Espero ter sido claro.

Vlw.

if (!rs.next()) // verifica se o resultado foi encontrado
{
JOptionPane.showMessageDialog(null,“Não existem questões para o Módulo Selecionado.”,“Erro de Processamento”,JOptionPane.INFORMATION_MESSAGE);
}

        else { 
            
            while([b]rs.next[/b]()){ 
                      
                lista.add(rs.getString("p")); 
                lista.add(rs.getString("rp1")); 
                lista.add(rs.getString("rp2")); 
                lista.add(rs.getString("rp3")); 
                lista.add(rs.getString("rp4")); 
                lista.add(rs.getString("rp5")); 
                lista.add(rs.getString("rpc")); 
                
            } 
            
            for (Iterator it = lista.iterator();it.hasNext();){ 
                    System.out.println(it.next()); 
            } 
        } 

Você está dando Next() 2 vezes antes de fazer lista.add(). O primeiro Next seta no primeiro registro, o segundo seta no segundo e você só pega do segundo em diante, assim sempre vai pegar n -1 elementos.

Seu problema é que quando faz a verificação if (!rs.next()) ele já anda o ponteiro para o próximo, quando for imprimir no while o primeiro sempre foi pras cucuias … tem que rever sua lógica.

Agora q percebi a besteira q estava fazendo…

Obrigado.

Você pode acrescentar rs.first() dentro do else antes do while(rs.next()).

É uma pena a interface ResultSet ser mais antiga que a Iterator…