Update em StringBuffer

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.

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

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.