当前位置: 首页 > 知识库问答 >
问题:

运行时引发的ClassCastException

万俟渊
2023-03-14

我一直在开发这个简单的Java程序,在某种程度上它抛出了一个“ClassCastException”,我不知道为什么。程序中发生的事情是,它读取2个文本文件,并将它们存储在对象数组列表中(因为我使用相同的方法读取这两个文件)

稍后,当我尝试将这些对象转换为我创建的自定义数据类型时,程序会抛出此错误。我做错了什么?

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!");
                        }
                    }

^^这就是我得到异常的地方,就在“客户客户=(客户)目标”

我有两个班,客户和员工。它在运行时抛出“线程中的异常”main“java.lang.ClassCastException:Staff不能转换为Customer”。编译时没有问题。

readFile方法//更新

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 (IOExcepthtml" target="_blank">ion ex) {
        System.out.println("Error reading file '" + fileName + "'");
    }

    return elements;
}

我做错了什么?提前谢谢。

共有2个答案

徐凌
2023-03-14
ArrayList<Object> clients = TextFileHandler.readFile(accText, userState);

因此,客户机包含对象类型的元素。

在for循环中,当您尝试将对象(属于对象类型)强制转换为客户时,会发生ClassCastException。

Customer customer = (Customer) objs;

为了使转换成功,必须确保要转换的对象是子类的实例。如果超类对象不是子类的实例,则会发生运行时ClassCastException。这可以通过使用instanceof运算符来确保。

这里有一个例子可以让事情变得更清楚:

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

也不例外。原因是,具体类型为圆形。

现在,您的案例有点像:

Object o;
(Circle)o.getRadius(); // Exception is thrown at this line
王修为
2023-03-14

由于您的对象列表中只有两种类型的数据类型(Staff和Customer),所以在进行类型转换之前,您可以使用instanceof操作符,如下所示-

for( Object obj : staffs){

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

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

}

 类似资料:
  • null 因此,具有外部依赖关系的作业可以正常工作,但是UDF会产生上面的错误。我还试图将我的应用程序jar(其中包含驱动程序和spring代码以及worker中已经存在的所有其他依赖项)添加到worker中的dependencies文件夹中,但仍然会产生错误。还试图将其放置在worker中与驱动程序相同的位置,并使用“spark.jars”将其位置添加到sparkConf,但没有成功。有什么建议

  • 用编译后,我尝试用java运行,它运行了,但随后抛出了一个

  • 无法从Git bash运行以下命令。我在错误以下; Git版本:Git版本2.28.0.Windows.1操作系统:Windows10

  • 我是拉威尔的新手,所以你可能不得不忍受我,但我似乎有个小问题。现在,首先,我创建了一个基本模板,并使用phpMyAdmin和Wamp成功地运行了它,它运行得很好。我还得到了一个老项目,我被要求看一看,但由于某种原因,我无法让它运行。 这就是我正在使用的过程: 1:打开cmd更改到正确的目录 2:安装编写器 3:将目录更改为项目目录 4:运行 错误: PHP警告:需要(C:\wamp64\www\p