Java Поиск бин - PullRequest
       1

Java Поиск бин

0 голосов
/ 13 апреля 2020

Итак, я пытаюсь создать систему управления университетом, которая использует файл 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);
            }
        }

1 Ответ

0 голосов
/ 13 апреля 2020

IndexOutOfBoundsException выбрасывается, чтобы указать, что какой-либо индекс (например, массив, строка или вектор) находится вне диапазона. В следующей строке вы пытаетесь получить доступ к data.get(0), не проверяя, есть ли у него элемент.

System.out.println(data.get(0).getFname());

Вы должны сделать это следующим образом:

if (data != null && data.size() >= 1) {
    System.out.println(data.get(0).getFname());
}

На Примечание: всякий раз, когда вы разбиваете строку, вы должны проверить длину полученного массива, прежде чем пытаться получить доступ к элементу из него, чтобы избежать ArrayIndexOutOfBoundsException.

String [] up = line.split(":");
if(up.length >= 2) {
    System.out.println(up[0] +", " + up[1]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...