【问题标题】:ClassCastException when casting to object array转换为对象数组时出现 ClassCastException
【发布时间】:2013-12-13 22:55:42
【问题描述】:

我收到此运行时错误:

Exception in thread "main" java.lang.ClassCastException: Employee cannot be cast to [LEmployee;

它来自这行代码,我将文件内容转换为 Employee[]

Employee[] EmpArray;
EmpArray = (Employee[]) objectIn.readObject();

令我困惑的是错误中的“[L”。我不知道这是从哪里来的。

【问题讨论】:

  • @Kevin 否 [ 表示 JNI 中的数组。 L 是完全限定类名开始的标记。
  • 您遇到了异常,因为您正在阅读的是单个员工,而不是数组。

标签: java arrays exception runtime-error classcastexception


【解决方案1】:

可以在此处找到解释字节码(以及更多内容)的很好读物:http://www.cubrid.org/blog/dev-platform/understanding-jvm-internals/ - 请参阅表 1 了解字节码类型表达式。

您的案例中有趣的是(Java 字节码 - 类型 - 描述):

  • L - 引用 - 类的实例
  • [ - 参考 - 一个数组维度

次要 nitpick:您的变量 EmpArray 不遵循 Java 命名约定,因为它以大写字母开头。参考:http://www.javapractices.com/topic/TopicAction.do?Id=58

【讨论】:

    【解决方案2】:

    [L in Java 表示“类对象的一维数组,其完全限定名称紧随其后,直到(且不包括); 符号”(例如,[Ljava.lang.String; 表示String[] 数组)。更多细节可以在related questionStackOverflow上找到。

    没有更多细节,只能推测ClassCastException的原因。

    显然您正试图从ObjectInputStream 反序列化Employee[] 数组,该数组实际上是从序列化的Employee(不是Employee[])对象中读取的。

    问题可能出在序列化逻辑中。

    要检查是否是这种情况,只需将readObject() 调用转换为Employee,而不是Employee[],看看是否有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-25
      • 2018-02-22
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多