2015-08-29 3 views
1

Я работаю над этой простой Java-программой и в момент, когда она генерирует «ClassCastException», и я не могу понять, почему. Что происходит в программе, она считывает из 2 текстовых файлов и хранит их в объекте Arraylists (потому что я использую тот же метод для чтения обоих файлов)ClassCastException в Runtime

Позже, когда я пытаюсь применить эти объекты к пользовательским типам данных I Сделано, программа выдает эту ошибку. Что я делаю не так?

public void staffFunctions() { 
    ArrayList<Object> staffs = TextFileHandler.readFile(staffText,userState); 

    for(Object obj: staffs) { 
     Staff staff = (Staff) obj; 
     if (staff.getUsername().equals(username) && staff.getPassword().equals(password)) { 
      staffMenu(staff); 
     } else { 
      System.out.println("Username/Password Invalid."); 
     } 
    } 

}

^^ Это требует меню, связанных с персоналом.

  ArrayList<Object> clients = TextFileHandler.readFile(accText, userState); 
     System.out.print("Enter Client Username > "); 
        String usernameClient = input.next(); 
        System.out.print("Enter amount > "); 
        int amount = input.nextInt(); 

        for(Object objs: clients) { 
         Customer customer = (Customer) objs; 
         if(customer.getUsername().equals(usernameClient)){ 
          ClientFunctions.withdraw(customer, username, amount); 
         } else { 
          System.out.println("Invalid Client Username!"); 
         } 
        } 

^^ Вот где я получаю исключение, точно в «Customer customer = (Customer) objs;»

У меня есть два Класса Клиент и Персонал. И он выбрасывает «Исключение в теме« main »java.lang.ClassCastException: Персонал не может быть передан клиенту», во время выполнения. Время компиляции не вызывает никаких проблем.

ReadFile Метод // Update

public static ArrayList<Object> readFile(String fileName, int userState) { 
    String line = null; 
    ArrayList<Object> elements = new ArrayList<>(); 

    try { 
     fileReader = new java.io.FileReader("src/" + fileName); 
     bufferedReader = new BufferedReader(fileReader); 

     while ((line = bufferedReader.readLine()) != null) { 
      String element[] = line.split(" "); 
      if (userState == 1) { 
       Customer customer = new Customer(element[1], element[3], element[5], element[7], element[9], element[11]); 
       elements.add(customer); 
      } else { 
       Staff staff = new Staff(element[1], element[3]); 
       elements.add(staff); 
      } 
     } 
     bufferedReader.close(); 
    } catch (FileNotFoundException ex) { 
     System.out.println("Unable to open file '" + fileName + "'"); 
    } catch (IOException ex) { 
     System.out.println("Error reading file '" + fileName + "'"); 
    } 

    return elements; 
} 

Что я здесь делаю неправильно? Заранее спасибо.

+3

Каков конкретный тип элементов в 'staffs' * во время выполнения * Виртуальная машина Java говорит вам, что бы они ни были, они **? а не 'Staff' экземпляры. ** –

+0

Я не понимал, что вы сказали Мэтт, извините. –

+1

Пожалуйста, отредактируйте свой вопрос, чтобы показать, как заполняются клиенты. Очевидно, что в нем есть объекты Staff.Я бы рекомендовал изменить код, чтобы клиенты не были списком объектов. Это трудно понять. –

ответ

1

Поскольку у вас есть только два типа типа данных (Staff и Customer) в ваших Object списках - staffs или clients, перед заливкой типа можно использовать оператор instanceof, как это -

for(Object obj : staffs){ 

    if(obj instance of Staff){ 
     Staff staff = (Staff) obj; 
    } 

    if(obj instance of Customer){ 
     Customer Customer = (Customer) obj; 
    } 
    ... 

} 
1
ArrayList<Object> clients = TextFileHandler.readFile(accText, userState); 

Таким образом, clients содержит элементы Object типа.

Внутри петли, когда вы пытаетесь отличить objs (от Object) до Customer, ClassCastException происходит.

Customer customer = (Customer) objs; 

Для литья, чтобы быть успешным, вы должны убедиться, что объект будет отбрасывать является экземпляром подкласса. Если объект суперкласса не является экземпляром подкласса, возникает исключение ClassCastException во время выполнения. Это можно сделать, используя оператор instanceof.

Вот пример, чтобы сделать вещи более ясно:

Object o = new Circle(); 
(Circle)o.getRadius(); // No exception at this point 

Там нет исключений. Причина в том, что o бетонный тип - круг.

Теперь ваш случай несколько напоминает:

Object o; 
(Circle)o.getRadius(); // Exception is thrown at this line