Итак, я пытаюсь создать систему управления университетом, которая использует файл bin для хранения и навигации. В этой части я получаю ошибку в то время как l oop, что я не могу понять, что с ней не так. Я получаю сообщение об ошибке "java .lang.IndexOutOfBoundsException" в то время как l oop. Я не могу go дальше с этой ошибкой
public class Tester {
public static void main(String[] args) {
try {
FileOutputStream fos = new FileOutputStream("people.bin");
Faculty fac1 = new Faculty((short)0x45a1, "ensar","khan");
fac1.write();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
login();
try {
FileInputStream fis = new FileInputStream("people.bin");
int firstByte = fis.read();
if(firstByte == -1)
System.out.println("file is empty");
ArrayList<UniversityPerson> data =
new ArrayList<UniversityPerson>();
ArrayList<UniversityPerson> types =
new ArrayList<UniversityPerson>();
types.add(new Faculty((short)0,"","")); //id 0
types.add(new Staff("","","")); //id 0
types.add(new Grad("","")); //id 0
types.add(new Undergrad("","")); //id 0
while(firstByte != -1){
data.add(types.get(firstByte).read());
System.out.println(data.get(0).getFname());
firstByte = fis.read();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private static boolean login(){
try {
Scanner keyIn = new Scanner(System.in);
System.out.println("please enter your user name: ");
String uname = keyIn.next();
Scanner inFile = new Scanner(new File("user.txt"));
while(inFile.hasNextLine()){
String line = inFile.nextLine();
String [] up = line.split(":");
System.out.println(up[0] +", " + up[1]);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return false;
}
}
abstract class UniversityPerson{
private String fname, lname;
UniversityPerson(String fn, String ln){
fname = fn;
lname = ln;
}
public String getFname() {
return fname;
}
public void setFname(String fname) {
this.fname = fname;
}
public String getLname() {
return lname;
}
public void setLname(String lname) {
this.lname = lname;
}
abstract void write();
abstract UniversityPerson read();
}
class Faculty extends UniversityPerson{
public static final byte id = 0;
private short officeNo;
Faculty(short officeNo,String fn, String ln){
super(fn,ln);
this.officeNo = officeNo;
}
void write(){
try {
FileOutputStream fos = new FileOutputStream("people.bin");
fos.write(id);
fos.write(officeNo); //0x12a5 (hob:12, "lob:a5")
fos.write(officeNo>>8); //0x0012 (hob:00, "lob:12")
//a512 (file contents) little endian
int fnlength = getFname().length();
fos.write(fnlength);
fos.write(fnlength>>8);
fos.write(getFname().getBytes());
int lnlength = getLname().length();
fos.write(lnlength);
fos.write(lnlength>>8);
fos.write(getLname().getBytes());
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
UniversityPerson read(){
return new Faculty(id,super.getFname(),super.getLname());
}
}
class Staff extends UniversityPerson{
public static final byte id = 1;
private String phoneNo;
Staff(String phoneNo,String fn, String ln){
super(fn,ln);
this.phoneNo = phoneNo;
}
@Override
void write() {
try {
FileOutputStream fos = new FileOutputStream("people.bin");
fos.write(id);
fos.write(Integer.parseInt(phoneNo));
int fnlength = getFname().length();
fos.write(fnlength);
fos.write(fnlength>>8);
fos.write(getFname().getBytes());
int lnlength = getLname().length();
fos.write(lnlength);
fos.write(lnlength>>8);
fos.write(getLname().getBytes());
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
UniversityPerson read() {
return new Staff(String.valueOf(phoneNo),super.getFname(),super.getLname());
}
}
class Student extends UniversityPerson{
Student(String fn, String ln){
super(fn,ln);
}
@Override
void write() {
try {
FileOutputStream fos = new FileOutputStream("people.bin");
int fnlength = getFname().length();
fos.write(fnlength);
fos.write(fnlength>>8);
fos.write(getFname().getBytes());
int lnlength = getLname().length();
fos.write(lnlength);
fos.write(lnlength>>8);
fos.write(getLname().getBytes());
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
UniversityPerson read() {
return new Student("ensar","khan");
}
}
class Grad extends Student{
public static final byte id = 2;
Grad(String fn, String ln){
super(fn,ln);
}
}
class Undergrad extends Student{
public static final byte id = 3;
Undergrad(String fn, String ln){
super(fn,ln);
}
}