Problema Estranho

na minha aplicação uma das páginas trava em um certo ponto.
ponto é

    String[] respostasbd = (String[]) session.getAttribute("respostas");
    String[] perguntas = (String[]) session.getAttribute("perguntas");

após essas duas linhas a página para e a máquina fica lenta.
o processo java.exe toma conta da CPU ew mesmo fechando tudo ele continua rodando.

qual o problema?

aqui está o fonte completo:
os JOptionPane foram usados para saber onde está o erro.

<%@page import = "java.sql.Connection"%>
<%@page import = "java.sql.DriverManager"%>
<%@page import = "java.sql.PreparedStatement"%>
<%@page import = "java.sql.ResultSet"%>
<%@page import = "java.sql.SQLException"%>

<%
try {

    Class.forName("org.gjt.mm.mysql.Driver").newInstance();
    Connection conexao = DriverManager.getConnection("jdbc:mysql://localhost/info_pai","infocad","dacofni123");
    //para teste
    javax.swing.JOptionPane.showMessageDialog(null,"carregou o driver");

    // ele para de executar aqui
    String[] respostasbd = (String[]) session.getAttribute("respostas");
    String[] perguntas = (String[]) session.getAttribute("perguntas");

    //para teste
    for(int a = 0; a < 10; a++){
        javax.swing.JOptionPane.showMessageDialog(null,String.valueOf(a));
    }

    // Obtém as respostas digitadas pelo aluno na página anterior
    String[] respostasusu = new String[10];

    javax.swing.JOptionPane.showMessageDialog(null,"primeiro for");
    for (int i = 0;i<respostasusu.length;i++){
        javax.swing.JOptionPane.showMessageDialog(null,String.valueOf(i));
        String resp = "Resp" +  String.valueOf(i+1);
        respostasusu[i] = request.getParameter(resp);
    }

    // Correção da prova
    int acertos = 0;
    int erros = 0;

    javax.swing.JOptionPane.showMessageDialog(null,"segundo for");
    for (int j = 0; j<respostasusu.length;j++){
        javax.swing.JOptionPane.showMessageDialog(null,String.valueOf(j));
        String usu = respostasusu[j];
        String bd = respostasbd[j];
        if (usu.equalsIgnoreCase(bd))
            acertos++;
        else
            erros++;
    }

    int total = acertos + erros;
    float aproveitamento = (acertos / total) * 100;

    //String codigoprova = (String) session.getAttribute("cd_prova");

    PreparedStatement prova = conexao.prepareStatement("INSERT INTO tb_prova (rm,nr_acertos,nr_erros,pc_aproveitamento,cd_data_prova)" +
                                                        " VALUES (?,?,?,?,?);");
    prova.setString(1,(String)session.getAttribute("usuario"));
    prova.setInt(2,acertos);
    prova.setInt(3,erros);
    prova.setFloat(4,aproveitamento);
    prova.setString(5,(String)session.getAttribute("cd_data_prova"));
    int result = prova.executeUpdate();

    prova = conexao.prepareStatement("SELECT * FROM tb_prova;");
    ResultSet resulprova = prova.executeQuery();
    resulprova.last();

    javax.swing.JOptionPane.showMessageDialog(null,"terceiro for");
    for (int k = 0; k < respostasusu.length; k++){
        javax.swing.JOptionPane.showMessageDialog(null,String.valueOf(k));
        PreparedStatement resposta = conexao.prepareStatement("INSERT INTO tb_respostas (id_prova,cd_questao,resposta,rm)" +
                                                               " VALUES (?,?,?,?);");
        resposta.setInt(1,resulprova.getInt("id_prova"));
        resposta.setInt(2,Integer.parseInt(perguntas[k]));
        resposta.setString(3,respostasusu[k]);
        resposta.setString(4,(String) session.getAttribute("usuario"));
        result += resposta.executeUpdate();
    }

    if (result == 11){
        response.sendRedirect("./mensagem_prova.jsp");
    } else {
        response.sendRedirect("./prova.jsp?ERRO=Problema no Banco de Dados, não foi possível concluir a sua prova");
    }

} catch(Exception e){
    response.sendRedirect("realizar_prova.jsp?erro=ERRO: " + e.toString());
}
%>

qualquer ajuda eu agradeço

Se for possível, use HashMap para salvar dados na sessão, não vetor, que é bem mais complexo. Isso alivia os streamings de transmissão de dados, processamento, uso de memória… Transmitir vetor pela sessão causa sobrecarga no sistema.

http://www.guj.com.br/posts/list/31205.java

Mas cadê o commit ou rollback das suas operações com o banco de dados??

Sem um nem outro o banco vai ficar esperando até que isso aconteça, ou um commit ou um rollback.

Após todo o processo lá no final faça o seguinte:

conexao.commit();

catch(Exception e) {
  conexao.rollback()
}
finally {
  conexao.close();
}

E não se esqueça de fechar SEMPRE os resultset e os PreparedStatement senão vai ficar coisa pendurada lá no banco e você não conseguirá mais conexões.