ArrayList

Estou com uma pergunta tão idiota que dá até vergonha de perguntar, mas é que não acho solução.

Meu Problema:

Tenho uma ArrayList de um objeto que representa o número de linhas na minha JTable, da classe model.
pois bem, todos os outros métodos estão funcionando, perfeitamente, o problema é o remove() Não faço a menor ideia de porque tá dando Exception na hora de remover o ultimo elemento da ArrayList. fazendo uma correção, exceto o ultimo elemento todos os outros elementos estão sendo removidos normalmente, problema é o ultimo.

O erro:

Exception in thread “AWT-EventQueue-0” java.lang.IndexOutOfBoundsException: Index: 6, Size: 6

código do Model do Jtable.

package utfpr.tsi.meOrganize.model.impl;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;

import javax.swing.table.AbstractTableModel;

import utfpr.tsi.meOrganize.model.IEModelTable;
import utfpr.tsi.meOrganize.model.entity.Discipline;

/**
 * Classe responsável por modelar a Jtable do sistema 
 * informando: os nomes das colunas e das linhas, seu tamanho,
 * e seus métodos para o comportamento da JTable. Além de, 
 * guarda as alterações e remoções em uma fila para um 
 * possível resgate.
 * <br><br>
 * Nome do projeto: MeOrganize  <br>
 * Integra ao pocote: utfpr.tsi.meOrganize.model.impl<br>
 * @author Vinicius Cavalcanti
 * @since Implementação da aplicação.
 * @version 1.0v 2016
 */
public class DisciplineModelTabel extends AbstractTableModel implements IEModelTable<Discipline> {
	
	private ArrayList<Discipline> rows;
	private Queue<Discipline> listRemoved;
	private String[] columns = new String[]{"ID", "Disciplinas"};
	
	private static final int COL_ID = 0;
	private static final int COL_NAME = 1;
	
	/**
	 * Construtor: espera um objeto do tipo Discipline para 
	 * instanciar a lista das Disciplinas.
	 * @param disciplines - lista das disciplinas.
	 */
	public DisciplineModelTabel(ArrayList<Discipline> disciplines) {
		this.rows = new ArrayList<>(disciplines);
		listRemoved = new LinkedList<>();
	}
	
	/**
	 * Método que remove o ultimo elemento a entradar na fila.
	 */
	@Override
	public void undoLastRemoved() {
		if(!listRemoved.isEmpty()) {
			Discipline discipline = listRemoved.poll();
			addDiscipline(discipline);
		}
	}
	
	/**
	 * Método adiciona o elemento retirado da Jtable
	 * para guardar na fila de deletados, para recuperação.
	 */
	@Override
	public void addLastRemoved(Discipline discipline){
		listRemoved.add(discipline);
	}
	
	/**
	 * Método que limpa a fila.
	 */
	@Override
	public void clearlistRemoved() {
		if(!listRemoved.isEmpty())
			listRemoved.clear();
	}
	
	/**
	 * @return - True para fila cheia false para não.
	 */
	@Override
	public boolean isEmptyList() {
		return listRemoved.isEmpty();
	}
	
	/**
	 * @return quantidade de linhas na tabela.
	 */
	@Override
	public int getRowCount() {
		return this.rows.size();
	}

	/**
	 * @return quantidade de colunas na tabela.
	 */
	@Override
	public int getColumnCount() {
		return this.columns.length;
	}

	/**
	 * Método que retorna os valores das linhas e colunas da tabela.
	 * Instancia um objeto do tipo Disciplina e busca os valores de seus
	 * atributos
	 * @param rowIndex - Index da linha para retorno do valor.
	 * @param columnIndex - Index da coluna para retorno do valor.
	 * @return
	 */
	@Override
	public Object getValueAt(int rowIndex, int columnIndex) {
		Discipline discipline = rows.get(rowIndex);
		
		if(columnIndex == COL_ID)
			return discipline.getId();
		else if (columnIndex == COL_NAME)
			return discipline.getName();
		
		return "";
	}
	
	/**
	 * retorna o valor da linha selecionada da JTable
	 * retornando-o em um objeto.
	 * @param aValue - o item selecionado.
	 * @param rowIndex - index da linha do item da Jtable
	 * @param column - coluna do item selecionado.
	 */
	@Override
	public void setValueAt(Object aValue, int rowIndex, int column) {
		Discipline discipline = rows.get(rowIndex);
		
		if (column == COL_ID)
			discipline.setId((Integer) aValue);
		else if (column == COL_NAME)
			discipline.setName(aValue.toString());
	}
	
	/**
	 * Método que retorna o nome da coluna.
	 * @param columnIndex - o index da coluna
	 * @return - o nome da coluna.
	 */
	@Override
	public String getColumnName(int columnIndex) {
		return columns[columnIndex];
	}

	/**
	 * Método que retorna o tipo da coluna.
	 * @return o tipo da coluna.
	 */
	@Override
	public Class getColumnClass(int columnIndex) {
		if (columnIndex == COL_ID) {
			return Integer.class;
		}
		return String.class;
	}
	
	/**
	 * Método que retonar o objeto de uma linha da JTable.
	 * @param rowIndex - o index da linha selecionada.
	 * @return O item (disciplina) da linha selecionada.
	 */
	@Override
	public Discipline getDiscipline(int rowIndex) {
		return rows.get(rowIndex);
	}

	/**
	 * Método que adiciona uma elemento a Jtable e
	 * atualizá-a para mostrar o elemento nela.
	 * @param discipline - A entidade disciplina adicionada.
	 */
	@Override
	public void addDiscipline(Discipline discipline) {
		rows.add(discipline);
		int lastIndex = getRowCount() - 1;
		fireTableRowsInserted(lastIndex, lastIndex);

	}

	/**
	 * Método que altera um item na Jtable e 
	 * atualiza para mostrar a alteração na entidade.
	 * @param rowIndex - o index da linha selecionada para alteração
	 * @param marca - entidade que vai ser alterada.
	 */
	@Override
	public void update(int rowIndex, Discipline marca) {
		rows.set(rowIndex, marca);
		fireTableRowsUpdated(rowIndex, rowIndex);
	}

	/**
	 * Método que remove um item da JTable e também
	 * atualizá-a removendo o item da JTable.
	 * @param rowIndex - o index da linha do item que vai ser removido.
	 */
	@Override
	public void remove(int rowIndex) {
		fireTableRowsDeleted(rowIndex, rowIndex);
		rows.remove(rowIndex);
		
		listRemoved.add(rows.get(rowIndex));
	}
	
	@Override
	public String getArray() {
		String disciplines = "";
		
		for(int i = 0; i < rows.size(); i++) {
			disciplines += "index " + i + " nome: " + rows.get(i).getName() + "\n";
		}
		return disciplines;
	}
		
	/**
	 * Método que habilida a edição na célula selecionada
	 * @param rowIndex - linha selecionada.
	 * @param columnIndex - coluna selecionada
	 * @return retorna se Verdadeiro a célula pode ser editada falso para não.
	 */
	@Override
	public boolean isCellEditable(int rowIndex, int columnIndex) {
		return false;
	}
}

Quem pode me esclarecer fico muito grato.

Olá @viny_2 .
Para ficar mais fácil de encontrar o erro, adicionar mais linhas do stacktrace.

Acredito que seu erro esta aqui:

	rows.remove(rowIndex);
	
	listRemoved.add(rows.get(rowIndex));

Veja… você esta removendo um item da lista ‘rows’… e depois tentando pegar ele… ai ele não vai existir…

você pode fazer:

listRemoved.add( rows.remove(rowIndex) );

Pois quando você chama o remove do ArrayList, ele retorna quem você removeu.

Assim, isso foi agora, na tentativa louca de resolver o problema, no caso estava
eu adicionada a lista de removido
depois eu removia… como disse tentei inúmeras cambiaras tentando solucionar o problema.

Veja, no erro fala: java.lang.IndexOutOfBoundsException: Index: 6, Size: 6
o Size: 6 fala que sua lista tem 6 itens, logo tem os índices [0,1,2,3,4,5] e você esta tentando remover um índice 6.

Pois é, estranho que eu pensei nisto, a mandei por parâmetro (rowIndex - 1) ele deleta o penúltimo elemento.

Ps:
listRemoved.add(rows.get(rowIndex));
rows.remove(rowIndex);
fireTableRowsDeleted(rowIndex, rowIndex);
esta fó a implementação inicial. como inicio o problema.

tem como postar o stacktrace completo?

Olá,
Eu desisti de procurar a solução troquei a ArrayList por Vetor ambas são bem semelhantes não alterou muita coisa no quesito desempenho do software.