Удаление строки из бросков табличной модели ArrayOutOfBoundsException - PullRequest
0 голосов
/ 05 июля 2019

Приложение, которое я работал / обновлял, необходимо было исправить из-за утечек ресурсов.Это доска входа для пользователей, которые входят / выходят из защищенного местоположения, а основной пользовательский интерфейс представляет собой экран, на котором отображаются зарегистрированные в данный момент пользователи.Я отследил проблему с классом, который генерирует табличную модель, поскольку она оставляла ресурсы открытыми (набор результатов и соединение) - моя ошибка, потому что мой дизайн не установил основной интерфейс в качестве статического дисплея.

Я изменил еготеперь, чтобы ресурсы были закрыты и табличная модель генерировалась с использованием векторов.Теперь моя проблема заключается в том, что при попытке удалить строку я получаю ArrayOutOfBoundsException в методе getValueAt ().Я понимаю, что означает исключение, но в нем есть дополнительные детали, в которых указано «1> = 1».Я почти уверен, что это как-то связано с количеством строк в наборе данных, но этот последний бит меня озадачил, и я не могу / не понимаю, почему я получаю исключение.

Я предоставил код, который генерирует табличную модель.Есть два разных метода удаления для удаления строки, которые я пробовал.Первая имеет номер строки, переданный для удаления, а затем запускает соответствующее действие уведомления для модели;второй метод выполняет итерацию по первому столбцу вектора, чтобы найти значение - при обнаружении он удаляет строку, в которой было найдено значение, и запускает соответствующее действие уведомления.Обе эти ошибки в одной и той же строке, указанной в методе getValueAt ().

import java.awt.Dialog;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Vector;

import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableModel;

class VectorTableModel extends AbstractTableModel
{
	private static final long serialVersionUID = -5972915456054755527L;
	
	private PreparedStatement prepStat;
	private Connection conn;
	private ResultSet rs;
	private ResultSetMetaData rsmd;
	private int rowCount;
	
	private Vector<String> colNames;
	private Vector<Vector<Object>> data;
	
	public VectorTableModel(String query, int closedRoom) throws SQLException 
	{
		//set the query & execute it
		setTableModel(query, closedRoom);
		
	}
	
	public DefaultTableModel setTableModel(String query, int room) throws SQLException, IllegalStateException
	{
		//create new connection - this is always done
		//regardless of previous connection status.
		conn = ConnectToDatabase.getDBConnection();

		colNames = new Vector<String>();
		data = new Vector<Vector<Object>>();
		
		try {
			if(room > 0 ) {
				prepStat = 	conn.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
				prepStat.setInt(1, room);
			}
			else if(room < 0)
				prepStat = conn.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
			
			rs = prepStat.executeQuery();
			rsmd = rs.getMetaData();
			
			//get column names
			int colCount = rsmd.getColumnCount();
			for(int column=1; column <= colCount; column ++)
				colNames.add(rsmd.getColumnName(column));
			
			//get table data
			while(rs.next()) {
				Vector<Object> vector = new Vector<Object>();
				for(int colIndex=1; colIndex <= colCount; colIndex++)
					vector.add(rs.getObject(colIndex));
				
				data.add(vector);
			}
			
			//determine number of rows in resultset by
			//moving to the last row and getting the row
			//number
			rs.last();
			rowCount = rs.getRow();
			
			//notify JTable that model has changed
			fireTableDataChanged();
			
		}
		catch (Throwable thrownError) {
			ExceptionDialog ed = new ExceptionDialog("Processing error - rolling back transaction.",
					"Unable to generate table - please contact System Administrator.",thrownError);
			ed.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);
			ed.setLocationRelativeTo(null);
			ed.setVisible(true);
			
			if(conn != null) {
				try {
					conn.rollback();
				}
				catch (SQLException sqlEx) {
					sqlEx.printStackTrace();
				}
			}
			System.exit(1);
		}
		finally {
			//close the connection
			if(prepStat != null)
				prepStat.close();
			
			conn.setAutoCommit(true);
			conn.close();
			
		}
		return new DefaultTableModel(data, colNames);
	}
	
	//get column names from vector
	public String getColumnName(int column) throws IllegalStateException
	{
		if(conn == null)
			throw new IllegalStateException("No connection to the database");
		
		
		return colNames.elementAt(column).toString();
	}

	public int getColumnIndex(String columnName) throws IllegalStateException
	{
		if(conn == null)
			throw new IllegalStateException("No connection to the database");
		
		int index = 0;
		
		for(int x=0; x < colNames.size(); x++)
		{
			if(columnName == colNames.elementAt(x))
				index = x;
		}
		
		return index; //return 0 if error occurs		
	}
	
	//get the number of columns in the vector
	public int getColumnCount() throws IllegalStateException
	{
		if(conn == null)
			throw new IllegalStateException("No connection to the database");
		
		return colNames.size();
	}
	
	//get the number of rows in the vector
	public int getRowCount() throws IllegalStateException
	{
		if(conn == null)
			throw new IllegalStateException("No connection to the database");
		
		return rowCount;
	}
	
	//set button column editable so that it can be clicked
	public boolean isCellEditable(int row, int col)
	{
		if(col == 5)
			return true;
		else
			return false;
	}

	public Object getValueAt(int row, int col) throws IllegalStateException
	{
		//check if database connection is still valid
		if(conn == null)
			throw new IllegalStateException("No connection to the database");		

		return data.elementAt(row).elementAt(col); //line where Exception occurs
	}

	//remove record from data set
	public void removeRow(int row) 
  {
		data.remove(row);
		fireTableRowsDeleted(row, row);
	}
	
	public void removeByUser(String empID)
	{
		int row = 0;
		
		for(int x = 0; x < data.size(); x++)
		{
			String id = data.elementAt(x).elementAt(0).toString();
			if(id.equalsIgnoreCase(empID))
			{
				data.remove(x);
				row = x;
				break;
			}
		}
		
		fireTableRowsDeleted(row, row);
	}
}

Это исключение, которое я получаю:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1 >= 1
    at java.util.Vector.elementAt(Unknown Source)
    at VectorTableModel.getValueAt(VectorTableModel.java:172)
    at javax.swing.JTable.getValueAt(Unknown Source)
    at javax.swing.JTable.prepareRenderer(Unknown Source)
    at SignInBoard$6.prepareRenderer(SignInBoard.java:540)
    at javax.swing.plaf.basic.BasicTableUI.paintCell(Unknown Source)
    at javax.swing.plaf.basic.BasicTableUI.paintCells(Unknown Source)
    at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source)
    at javax.swing.plaf.ComponentUI.update(Unknown Source)
    at javax.swing.JComponent.paintComponent(Unknown Source)
    at javax.swing.JComponent.paint(Unknown Source)
    at javax.swing.JComponent.paintToOffscreen(Unknown Source)
    at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source)
    at javax.swing.RepaintManager$PaintManager.paint(Unknown Source)
    at javax.swing.RepaintManager.paint(Unknown Source)
    at javax.swing.JComponent._paintImmediately(Unknown Source)
    at javax.swing.JComponent.paintImmediately(Unknown Source)
    at javax.swing.RepaintManager$4.run(Unknown Source)
    at javax.swing.RepaintManager$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
    at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source)
    at javax.swing.RepaintManager.access$1200(Unknown Source)
    at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
...