ERRO: java.lang.ArrayIndexOutOfBoundsException [RESOLVIDO]

Opa opa… sou novo no forum e estou desenvolvendo uma aplicação com base em alguns estudos mas venho me deparando com um problema bem chato que nao faco a minima ideia de como resolver.

Na aplicacao so esta sendo possivel busca, editar ou remover uma unica vez a cada execucao. Quando executo para efetuar uma segunda busca aparece:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1 >= 1  

Em alguns foruns vi que isso é ocasionado por causa de estouro do array, mas nao estou sabendo como tratar.

Como poderia corrigir esse chato problema, se eh q eh o estouro do array mesmo, ou o q for.

Obrigado aí!

Inclua a listagem completa do erro, ela é importante para determinar a área da aplicação em que o erro foi disparado.

Provavelmente você está iterando sobre uma coleção (list, array, etc) e procurando um índice maior que o existente (como se a list tivesse 2 elementos e você buscasse o nº 3).

Desculpem-me. Segue listagem abaixo e o brigado.

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1 >= 1
        at java.util.Vector.removeElementAt(Vector.java:511)
        at javax.swing.table.DefaultTableModel.removeRow(DefaultTableModel.java:446)
        at view.TelaPrincipal.jButtonBuscarActionPerformed(TelaPrincipal.java:335)
        at view.TelaPrincipal.access$200(TelaPrincipal.java:10)
        at view.TelaPrincipal$3.actionPerformed(TelaPrincipal.java:166)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6263)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3255)
        at java.awt.Component.processEvent(Component.java:6028)
        at java.awt.Container.processEvent(Container.java:2041)
        at java.awt.Component.dispatchEventImpl(Component.java:4630)
        at java.awt.Container.dispatchEventImpl(Container.java:2099)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
        at java.awt.Container.dispatchEventImpl(Container.java:2085)
        at java.awt.Window.dispatchEventImpl(Window.java:2475)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Grande drsmachado, obrigado pelo retorno e meio q entendi o q mencionou, mas como estou chegando agora algumas coisas ainda nao ficam muito claras pra mim. Bom, de qualquer sorte segue trecho de consulta.

[code]public Iterator consultarFuncionario(String nome) throws Exception {
Vector busca = new Vector();
try {
String sql = null;
dataBase = new ConexaoDB();
conexao = dataBase.getConexao();

        if (nome == null || nome.equals("")) {
            sql = "SELECT nome, admissao, demissao, empresa, caixa FROM funcionario order by nome";
        } else {
            sql = "SELECT nome, admissao, demissao, empresa, caixa FROM funcionario where nome like '" + nome + "' order by nome";
        }

        Statement statement = conexao.createStatement();
        resultSet = statement.executeQuery(sql);

        while (resultSet.next()) {

            ArquivoMorto arqMorto = new ArquivoMorto();
            arqMorto.setNome(resultSet.getString("Nome"));
            arqMorto.setDataAdmissao(resultSet.getString("Admissao"));
            arqMorto.setDataDemissao(resultSet.getString("Demissao"));
            arqMorto.setEmpresa(resultSet.getString("Empresa"));
            arqMorto.setCaixa(resultSet.getString("Caixa"));

            busca.add(arqMorto);
        }
        resultSet.close();
    } catch (Exception exception) {
        exception.printStackTrace();
        throw new Exception("erro ao efetuar consulta :" + exception.getMessage());
    } finally {
        dataBase.fecharConexao();
    }

    return busca.iterator();
}[/code]

A colection em questão é um Vector.
Bem, como disse acima, você está realizando uma consulta dentro de uma estrutura de repetição (ou iteração) do tipo for, while ou do/while.
Mas, em algum momento, existe a chamada ao indice que está maior que o tamanho retornado pelo método size() do objeto em questão.

Leia o erro, ele informa que o problema está ocorrendo na sua classe TelaPrincipal, linha 335… posta esse trecho aí…

Ta aí, chará.

[code]DefaultTableModel modeloTadela = (DefaultTableModel) jTable1.getModel();
while (table1Linhas > 0) {
modeloTadela.removeRow(1); // linha 335
table1Linhas++;
}
jTable1.setModel(modeloTadela);

    try {
        String nome = jTextFieldBusca.getText();
        ArquivoMortoBS arquivoMortobs = new ArquivoMortoBS();
        Iterator vectorBusca = arquivoMortobs.consultar(nome);
        if (vectorBusca.hasNext()) {
            ArquivoMorto busca = (ArquivoMorto) vectorBusca.next();
            adicionarLinhaTabela(busca);
        } else {
            JOptionPane.showMessageDialog(null, "Funcionário não encontrado");
        }
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, e.getMessage());
    }[/code]

Aqui:

[code]DefaultTableModel modeloTadela = (DefaultTableModel) jTable1.getModel();
while (table1Linhas > 0) {
modeloTadela.removeRow(1); // <- ERRO AQUI
table1Linhas++;
}
jTable1.setModel(modeloTadela);

    try {
        String nome = jTextFieldBusca.getText();
        ArquivoMortoBS arquivoMortobs = new ArquivoMortoBS();
        Iterator vectorBusca = arquivoMortobs.consultar(nome);
        if (vectorBusca.hasNext()) {
            ArquivoMorto busca = (ArquivoMorto) vectorBusca.next();
            adicionarLinhaTabela(busca);
        } else {
            JOptionPane.showMessageDialog(null, "Funcionário não encontrado");
        }
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, e.getMessage());
    }[/code]

Você tá sempre removendo a linha 1, mas nada garante que a mesma exista… não seria o caso de você fazer essa verificação antes?
Ou rever essa lógica… mas o erro está alí…

Seguinte. Com o código abaixo você queria remover uma linha enquanto a tabela estivesse com linhas, certo?

while (table1Linhas > 0) { modeloTadela.removeRow(1); // <- ERRO AQUI table1Linhas++; }

Porém você manda remover a linha de índice 1, que é a linha 2 da tabela. Lembre-se que a linha 1 será o índice 0, a linha 2 será o índice 1 e assim em diante.

[quote=marcio_gs]Seguinte. Com o código abaixo você queria remover uma linha enquanto a tabela estivesse com linhas, certo?

while (table1Linhas > 0) { modeloTadela.removeRow(1); // <- ERRO AQUI table1Linhas++; }

Porém você manda remover a linha de índice 1, que é a linha 2 da tabela. Lembre-se que a linha 1 será o índice 0, a linha 2 será o índice 1 e assim em diante.[/quote]

Blz, obrigado mas mesmo alterando o modeloTabela.removeRow para 0 tb da erro.

[quote=zedd][quote=marcio_gs]Seguinte. Com o código abaixo você queria remover uma linha enquanto a tabela estivesse com linhas, certo?

while (table1Linhas > 0) { modeloTadela.removeRow(1); // <- ERRO AQUI table1Linhas++; }

Porém você manda remover a linha de índice 1, que é a linha 2 da tabela. Lembre-se que a linha 1 será o índice 0, a linha 2 será o índice 1 e assim em diante.[/quote]

Blz, obrigado mas mesmo alterando o modeloTabela.removeRow para 0 tb da erro.[/quote]

O “erro” nesse caso é usar uma variável para verificar o tamanho de outra coisa.
Se você quer remover linhas da tabela, faça o seguinte:

if (modeloTadela.getRowCount() > 0){ // esse trecho verifica se a tabela esta com alguma linha // e aqui vc vai removendo com o removeRow... OU: modeloTadela.setRowCount(0); // isso remove todas as linhas... \o/

Vide javadoc para esse método:

[code]void javax.swing.table.DefaultTableModel.setRowCount(int rowCount)

Sets the number of rows in the model. If the new size is greater than the current size, new rows are added to the end of the model If the new size is less than the current size, all rows at index rowCount and greater are discarded. [/code]

Não entendi essa parte:

tableLinhas++;

O while não itera sobre a tabela enquanto esse valor for > 0?
Sendo assim, acredito que você deve decrementar o tableLinhas e não acrescentar…
Uma sugestão é trocar

while(tableLinhas > 0){...

por

while(modeloTabela.getRowCount() > 0){...

[quote=marcelo.bellissimo][quote=zedd][quote=marcio_gs]Seguinte. Com o código abaixo você queria remover uma linha enquanto a tabela estivesse com linhas, certo?

while (table1Linhas > 0) { modeloTadela.removeRow(1); // <- ERRO AQUI table1Linhas++; }

Porém você manda remover a linha de índice 1, que é a linha 2 da tabela. Lembre-se que a linha 1 será o índice 0, a linha 2 será o índice 1 e assim em diante.[/quote]

Blz, obrigado mas mesmo alterando o modeloTabela.removeRow para 0 tb da erro.[/quote]

O “erro” nesse caso é usar uma variável para verificar o tamanho de outra coisa.
Se você quer remover linhas da tabela, faça o seguinte:

if (modeloTadela.getRowCount() > 0){ // esse trecho verifica se a tabela esta com alguma linha // e aqui vc vai removendo com o removeRow... OU: modeloTadela.setRowCount(0); // isso remove todas as linhas... \o/

Vide javadoc para esse método:

[code]void javax.swing.table.DefaultTableModel.setRowCount(int rowCount)

Sets the number of rows in the model. If the new size is greater than the current size, new rows are added to the end of the model If the new size is less than the current size, all rows at index rowCount and greater are discarded. [/code][/quote]

Pronto, resolvido o problema. Muito obrigado marcelo.belissimo, so q agora apareceu outra coisa. A consulta so esta podendo ser executada uma unica vez com exito. Se tento fazer uma nova busca aparece o erro em anexo.

[quote=drsmachado]Não entendi essa parte:

tableLinhas++;

O while não itera sobre a tabela enquanto esse valor for > 0?
Sendo assim, acredito que você deve decrementar o tableLinhas e não acrescentar…
Uma sugestão é trocar

while(tableLinhas > 0){...

por

while(modeloTabela.getRowCount() > 0){...

[/quote]

Fiz a alteração e corrigiu. obrigado, só que agora estou com outro problema informado acima.

Então, algum erro está acontecendo, mas você está encapsulando ele com o try/catch… faz o seguinte, pelo menos pra podermos saber onde está ocorrendo, altera o seu try/catch e manda ele imprimir o stackTrace()… assim:

... } catch (Exception e) { e.printStackTrace(); // <- adiciona isso pra ele cuspir a exceção no console JOptionPane.showMessageDialog(null, e.getMessage()); }

Ou, debugando a aplicação, e quando chegar nesse ponto você já consegue ver o que está acontecendo…

É este catch que está sendo executado, posta aí a mensagem do console de erro

#  catch  (Exception e) {  
#             JOptionPane.showMessageDialog(null, e.getMessage());  
#         }

[quote=marcelo.bellissimo]Então, algum erro está acontecendo, mas você está encapsulando ele com o try/catch… faz o seguinte, pelo menos pra podermos saber onde está ocorrendo, altera o seu try/catch e manda ele imprimir o stackTrace()… assim:

... } catch (Exception e) { e.printStackTrace(); // <- adiciona isso pra ele cuspir a exceção no console JOptionPane.showMessageDialog(null, e.getMessage()); }

Ou, debugando a aplicação, e quando chegar nesse ponto você já consegue ver o que está acontecendo…[/quote]

Ai o q mostra no console

java.lang.ArrayIndexOutOfBoundsException: 1 >= 1 at java.util.Vector.elementAt(Vector.java:427) at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:648) at javax.swing.JTable.setValueAt(JTable.java:2719) at view.TelaPrincipal.adicionarLinhaTabela(TelaPrincipal.java:379) at view.TelaPrincipal.jButtonBuscarActionPerformed(TelaPrincipal.java:351) at view.TelaPrincipal.access$200(TelaPrincipal.java:10) at view.TelaPrincipal$3.actionPerformed(TelaPrincipal.java:166) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) at java.awt.Component.processMouseEvent(Component.java:6263) at javax.swing.JComponent.processMouseEvent(JComponent.java:3255) at java.awt.Component.processEvent(Component.java:6028) at java.awt.Container.processEvent(Container.java:2041) at java.awt.Component.dispatchEventImpl(Component.java:4630) at java.awt.Container.dispatchEventImpl(Container.java:2099) at java.awt.Component.dispatchEvent(Component.java:4460) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168) at java.awt.Container.dispatchEventImpl(Container.java:2085) at java.awt.Window.dispatchEventImpl(Window.java:2475) at java.awt.Component.dispatchEvent(Component.java:4460) at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Desculpe mas infelismente ainda nao sei usar o debug. :?

Bem, aí seria outra história… veja o erro:

at view.TelaPrincipal.adicionarLinhaTabela(TelaPrincipal.java:379)

Diz que é no método 'adicionarLinhaTabela", no arquivo TelaPrincipal, linha 379… novamente, manda aí o código pra gente ver o que tá fazendo ali no método… aposto que tem algo a ver com aquela variável, ainda, rs!

[quote=marcelo.bellissimo]Bem, aí seria outra história… veja o erro:

at view.TelaPrincipal.adicionarLinhaTabela(TelaPrincipal.java:379)

Diz que é no método 'adicionarLinhaTabela", no arquivo TelaPrincipal, linha 379… novamente, manda aí o código pra gente ver o que tá fazendo ali no método… aposto que tem algo a ver com aquela variável, ainda, rs![/quote]

vamos la! hehehehe…

[code]public void adicionarLinhaTabela(ArquivoMorto morto) {
String Nome = morto.getNome();
String Admissao = morto.getDataAdmissao();
String Demissao = morto.getDataDemissao();
String Empresa = morto.getEmpresa();
String Caixa = morto.getCaixa();

    DefaultTableModel modeloTadela = (DefaultTableModel) jTable1.getModel();

    String[][] novaLinha = new String[][]{
        {Nome, Admissao, Demissao, Empresa, Caixa}
    };

    modeloTadela.addRow(novaLinha);

    jTable1.setModel(modeloTadela);

    jTable1.setValueAt(Nome, table1Linhas, 0); // linha 379
    jTable1.setValueAt(Admissao, table1Linhas, 1);
    jTable1.setValueAt(Demissao, table1Linhas, 2);
    jTable1.setValueAt(Empresa, table1Linhas, 3);
    jTable1.setValueAt(Caixa, table1Linhas, 4);
    table1Linhas++;
}[/code]