Так что я создаю своего рода программу для студентов, где я могу создавать задания со стандартами и добавлять к ним оценки учеников.
Как это в основном работает, я создаю таблицу и добавляю столбцы в зависимости от того, какие стандарты были включены, и добавляю строки, относящиеся к оценкам учащегося, в каждом стандарте. Затем пользователь редактирует таблицу, затем нажимает «Сохранить», и моя программа в основном просто берет данные из таблицы и добавляет их к объектам ученика и сохраняет их в каталоге программы.
По некоторым причинам, она работает отлично на моей машине windows, но при добавлении оценок для студентов машина OSX возвращает исключение, говорящее "java .lang.ArrayIndexOutOfBoundsException: 5> = 5", в то время как оно делает то, что должно быть на машине windows.
Я заставил программу распечатать трассировку стека, и она напечатала
java.base/java.util.Vector.elementAt(Unknown Source)
java.desktop/javax.swing.able.DefaultTableColumnModel.getColumn(Unknown Source)
Я выделил код, в котором это происходит, и обнаружил, что это происходит в этом блоке try catch
try {
if (elig) {
File assignment = new File(System.getProperty("user.home")+"/StudentDataHub/Resources/Assignments/" + labelName.getText() + ".txt");
FileInputStream fi = new FileInputStream(assignment);
ObjectInputStream oi = new ObjectInputStream(fi);
Assignment ass = (Assignment) oi.readObject();
oi.close();
fi.close();
//actual grade adding
for (int i = 0; i <= ass.students.size() - 1; i++) {
String[] args = tableActualGrades.getValueAt(i, 0).toString().split(" "); //opening files
String studfilename = args[0].toLowerCase() + args[1].toLowerCase();
File studfileog = new File(System.getProperty("user.home")+"/StudentDataHub/Resources/Students/" + studfilename + ".txt");
FileInputStream fi1 = new FileInputStream(studfileog);
ObjectInputStream oi1 = new ObjectInputStream(fi1);
Student stud = (Student) oi1.readObject();
oi1.close();
fi1.close();
int asspos = -1; //finding the assignment position in the stud.assignments arraylist
for (int j = 0; j <= stud.assignments.size() - 1; j++) {
if (stud.assignments.get(j).getAssignmentname().equalsIgnoreCase(ass.getAssignmentname())) {
asspos = j;
j = stud.assignments.size();
}
}
boolean[] gotstandards = ass.getStandards(); //a boolean array which determines which of the standards have been enabled or disabled
int[] actualgrades = new int[8];
for (int j = 0; j <= 4; j++) { //gets the values from the table according to which standards have been enabled/disabled and adds them to the student's grade arrays
if (gotstandards[j]) {
actualgrades[j] = Integer.parseInt(tableActualGrades.getValueAt(i, j + 1).toString());
} else {
actualgrades[j] = -1;
}
}
actualgrades[5] = Integer.parseInt(tableActualGrades.getValueAt(i, tableActualGrades.getColumnCount() - 3).toString());
actualgrades[6] = Integer.parseInt(tableActualGrades.getValueAt(i, tableActualGrades.getColumnCount() - 2).toString());
actualgrades[7] = Integer.parseInt(tableActualGrades.getValueAt(i, tableActualGrades.getColumnCount() - 1).toString()); //these lines set the grades for the required standards
stud.assignments.get(asspos).setGrades(actualgrades);
FileOutputStream fo = new FileOutputStream(new File(System.getProperty("user.home")+"/StudentDataHub/Resources/Students/" + studfilename + ".txt"));
ObjectOutputStream oo = new ObjectOutputStream(fo);
oo.writeObject(stud);
oo.close();
fo.close();
}
}
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "ERROR: " + e.getStackTrace()[0] +"; " + e.getStackTrace()[1], "Error", JOptionPane.ERROR_MESSAGE);
}
Опять же, это не выдает никаких ошибок на моей машине, но при тестировании его дистрибутива на ма c он выдает эти ошибки, которые я не только не понимаю, но и пытаюсь решить как У меня нет мамы c.
Здесь - скриншот того, как выглядит таблица (я включил код только для одной из вкладок, но я это в основном один и тот же код с разными переменными для остальных)