Update em StringBuffer

2 respostas
isaquealves

Bom dia pessoal,
Esta é minha primeira participação oficial na comunidade… :-o
indo direto ao assunto, to com problemas com um método que criei para tratar um stringbuffer. Ele é atualizado ao selecionar ou deselecionar um grupo de checkboxes. Ao selecionar, o stringbuffer recebe o valor da ActionCommand da checkbox, e ao deselecionar, o valor deve ser deletado. Até aqui tudo bem, o método funciona e talz… mas tá resultando em exceções quando deseleciono.
Segue o método:

private StringBuffer ModifyStringBuffered(StringBuffer buff, String buff_substring)
    {
        int inipos = buff.indexOf(buff_substring);
        int endpos = buff.indexOf(";");
        buff = buff.delete(inipos,endpos);
        while(buff.indexOf(";") == 0)
            buff = buff.deleteCharAt(0);
        
        return buff;
    }

e as exceções:

Exception in thread "AWT-EventQueue-0" java.lang.StringIndexOutOfBoundsException
        at java.lang.AbstractStringBuilder.delete(AbstractStringBuilder.java:705)
        at java.lang.StringBuffer.delete(StringBuffer.java:374)
        at org.simsge.cadastro.alunos.ModifyStringBuffered(alunos.java:1062)
        at org.simsge.cadastro.alunos.itemStateChanged(alunos.java:1025)
        at javax.swing.AbstractButton.fireItemStateChanged(AbstractButton.java:1877)
        at javax.swing.AbstractButton$Handler.itemStateChanged(AbstractButton.java:2176)
        at javax.swing.DefaultButtonModel.fireItemStateChanged(DefaultButtonModel.java:477)
        at javax.swing.JToggleButton$ToggleButtonModel.setSelected(JToggleButton.java:233)
        at javax.swing.JToggleButton$ToggleButtonModel.setPressed(JToggleButton.java:250)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:231)
        at java.awt.Component.processMouseEvent(Component.java:5517)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3135)
        at java.awt.Component.processEvent(Component.java:5282)
        at java.awt.Container.processEvent(Container.java:1966)
        at java.awt.Component.dispatchEventImpl(Component.java:3984)
        at java.awt.Container.dispatchEventImpl(Container.java:2024)
        at java.awt.Component.dispatchEvent(Component.java:3819)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
        at java.awt.Container.dispatchEventImpl(Container.java:2010)
        at java.awt.Window.dispatchEventImpl(Window.java:1791)
        at java.awt.Component.dispatchEvent(Component.java:3819)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
        at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)

To sem noção. Há dias que to lutando com isso… ainda não encontrei uma solução adequada. Qualquer dica será bem vinda.

2 Respostas

paulovittor23

Você tá tentando utilizar uma posição inválida na StringBuffer, poriusso você tá recebendo StringIndexOutOfBoundsException… provavelmente o que está acontecendo é que o método indexOf deve estar retornando -1 por não estar encontrando correspondência…

Em algum momento uma dessas duas linhas deve estar retornando -1…

int inipos = buff.indexOf(buff_substring); int endpos = buff.indexOf(";");

outro detalhe que é importante ressaltar é que StringBuffers, diferentemente de Strings, são mutáveis, ou seja, você não precisa atribuir o resultado de uma operação no StringBuffer para ele mesmo, como você fez aqui…

buff = buff.delete(inipos,endpos);

Bastava você fazer assim…

buff.delete(inipos,endpos);

Qqr coisa poste o resultado,
abraço

isaquealves

Valeu…
o raciocínio tava lento, mas graças à tua idéia, me toquei da besteira…
além dos erros simples, eu tava cometendo um crasso erro de lógica e de matemática.
tava fazendo isso:

private StringBuffer ModifyStringBuffered(StringBuffer buff, String buff_substring)
    {
        int inipos = buff.indexOf(buff_substring);//isso retorna a posição onde inicia a substring
        int endpos = buff.indexOf(";");//isso retorna a posição da primeira ocorrência de ;
        buff = buff.delete(inipos,endpos);//isso era impossível
        while(buff.indexOf(";") == 0)
            buff = buff.deleteCharAt(0);
        
        return buff;
    }

corrigi pra isso:

private StringBuffer ModifyStringBuffered(StringBuffer buff, String buff_substring)
{
        int inipos = buff.indexOf(buff_substring);
        int endpos = inipos + buff_substring.length() +1 ;//soma da posição inicial + comprimento da substring + 1
            try
            {
        
            buff.delete(inipos,endpos);
            while(buff.indexOf(";") == 0)
                buff.deleteCharAt(0);
            }
            catch(Exception e)
            {
               System.out.println("Exceção encontrada:\n"+buff.toString()+"\ninicio:"+Integer.toString(inipos)+"\nfim:"+Integer.toString(endpos));
               e.printStackTrace();
            }
        return buff;
    }

Deveria pegar não o índice do char “;” mas sim a soma da posição incial com o comprimento da substring que desejava apagar + 1.
Tava retornando -1 porque o primeiro código buscava o ‘indexOf(";")’ , e isso retorna a primeira posição do elemento ; no buffer…
Agora ta funcionando muito bem. Na verdade ainda há coisas que vou melhorar, mas esse já serve para o que preciso fazer…

Muito obrigado pelo toque! Valeu mesmo.

Criado 31 de dezembro de 2007
Ultima resposta 31 de dez. de 2007
Respostas 2
Participantes 2