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