这是一道面试题。
面试结束了,但这个问题还在我的脑海里。
我不能问面试官,因为我没有得到这份工作。
场景:
- 将 C1 类的对象放入带有键“a”的缓存中
后期代码:
C1 c1FromCache = (C1) cache.get("a");
此代码引发 ClassCastException。
可能是什么原因?
我说是因为其他人放置另一个具有相同键的对象,因此覆盖了它。有人告诉我不行,想想其他可能性。
我说可能定义类 C1 的 jar 在此节点上不可用(不确定这是否会导致类强制转换或 ClassNotFoundException,但我现在正在寻找任何线索。然后我说可能是错误的类版本?他们说所有节点都存在同一个 C1 类 jar)。
编辑/添加询问 get 是否正在抛出 ClassCast,但被告知没有。之后我告诉他我解决此类问题的措施是放入一个测试 jsp,该 jsp 将模仿这些操作并在异常之后放置更好的日志记录(堆栈跟踪)。这是问题的第二部分(如果在生产中发生这种情况,为什么以及你会怎么做)
还有其他人知道为什么缓存 get 会导致转换问题吗?
最佳答案
一个原因可能是插入对象的代码部分使用的类加载器与检索它的代码不同。
不能将一个类的实例强制转换为由不同类加载器加载的同一个类。
对编辑的回应:
What would you do if this happened in production?
这通常发生在读取和插入模块各自包含相同的包含 C1
的 jar 时。
由于大多数容器首先尝试父类加载器,然后是本地类加载器(Parent first 策略),因此解决问题的常见解决方案是加载距离插入和读取最近的公共(public)父类中的类模块。
如果将包含 C1
类的模块移动到父模块,则会强制两个子模块从父模块获取该类,从而消除任何类加载器差异。
关于java - 还有什么可以在java中抛出ClassCastException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16092141/