java.lang.ClassCastException
我的应用程序中有一个对象数组列表java.lang.ClassCastException,java,casting,Java,Casting,我的应用程序中有一个对象数组列表 private static ArrayList<Player> userList=new ArrayList<Player>(); 您应改为使用: List pl=Arrays.asList(toObject(receivedByteArray)); UPD:我不确定这是否只是一个命名问题:能否显示代码,在哪里发送/接收播放器?receivedByteArray是否包含播放器或它确实包含字节?如果是第二种情况,那么就没有直接的解决办
private static ArrayList<Player> userList=new ArrayList<Player>();
您应改为使用:
List pl=Arrays.asList(toObject(receivedByteArray));
UPD:我不确定这是否只是一个命名问题:能否显示代码,在哪里发送/接收播放器?
receivedByteArray
是否包含播放器或它确实包含字节?如果是第二种情况,那么就没有直接的解决办法。你能给我看一下stacktrace吗 我敢打赌你说的是,因为这是通过某些接口将Java对象作为字节流传输的标准方式。我还假设您的Player
类已经实现了,否则您将面临一个错误
如果在其中一侧出现ClassCastException
,则表示表示Player
类的类文件的版本不完全相同。要解决此问题,您需要确保两侧使用的类文件完全相同,或者向两侧的类添加具有相同值的私有静态最终长SerialVersionUID
根据实际异常情况更新:
这意味着你基本上要做以下几点:
ArrayList<?> list = (ArrayList<?>) object;
ArrayList list=(ArrayList)对象;
其中
对象
实际上是一个玩家
。要解决此问题,您需要确保对象
实际上是一个数组列表
,或者您需要转换为播放器
。字节[]不能转换为数组列表或从数组列表转换为数组列表。如果需要将集合表示为字节序列,则可能需要将其序列化。使用ObjectOutputStream和ObjectInputStream。避免明显的:玩家
!=<代码>播放器。请修正你的问题。此外,根据Java命名约定,类型/类名应该以大写字母开头。拥有一个ArrayList
。请发布您的toObject(…)方法的实现。@BalusC:请查看我的UPD(在我看到您的评论之前编写)receivedByteArray
显然是一个字节[]
。它的数组#asList()
只会给出一个包含1项的列表。你的回答根本不合逻辑。@BalusC:呵呵。我不知道他在toObject中做了什么,也不知道对象是如何发送的,但在发布stacktrace后,我知道我的代码确实有效。纯粹是巧合。另一种可能性是,一方以错误的方式转换了玩家列表,因此它只发射第一个玩家,而不是列表中的其他玩家。顺便说一句:塔拉是处女的名字,所以温柔地说她;)@BalusC:ups)我甚至尝试过编辑注释,但有一些时间限制,我可能无法编辑。@BalusC:您确定当客户端和服务器端存在不同版本的类时会抛出ClassCastException吗?我记不清了,但谷歌说这是InvalidClassException。不管怎样,如果看不到完整的图片(即发送/接收代码和stacktrace),就很难猜出真正的问题@Roman:是的,当然。只有在您已经定义了SerialVersionUID
时,才会引发InvalidClassException
。它也只在反序列化期间抛出,而不是在强制转换期间抛出。该类被序列化,并且在服务器和客户端使用相同的类。这里的对象肯定是ArrayList,因为这是我在服务器端转换为字节数组的东西,因此在客户端,为了捕获这些字节,我需要将它们转换为ArrayList。但在这样做的过程中,它抛出了铸造错误:(如果您在客户端获得了一个Player
而不是ArrayList
,那么这意味着服务器向客户端发送了一个Player
而不是ArrayList
。请验证服务器的代码。谢谢BalusC,您的分析帮了大忙。发送Player ArrayList时出错。它只发送Player。现在是W。)(非常感谢:)
java.lang.ClassCastException: Player cannot be cast to java.util.ArrayList
at Client.attemptLogin(Client.java:242)
at Client.main(Client.java:64)
List<Player> pl = Arrays.asList (toObject(receivedByteArray));
java.lang.ClassCastException: Player cannot be cast to java.util.ArrayList
ArrayList<?> list = (ArrayList<?>) object;