- 浏览: 1587030 次
- 性别:
- 来自: 吉林
文章分类
- 全部博客 (624)
- C/C++ (33)
- Java (181)
- 网络相关 (7)
- 我爱篮球 (3)
- 也爱足球 (4)
- 杂谈 (1)
- 系统架构 (3)
- Web Service (14)
- Framework (3)
- 系统命令 (8)
- 管理平台相关 (8)
- 其它 (35)
- Websphere (1)
- Struts2 (24)
- Hibernate (16)
- Spring (23)
- javascript (20)
- jquery (23)
- html/css/div (28)
- 数据库 (40)
- JavaWeb (27)
- 设计模式 (2)
- 文档编写 (3)
- SVN (5)
- Ant (1)
- Maven (13)
- 软件项目管理 (8)
- AOP (1)
- kindeditor (1)
- JSON (2)
- Servlt/JSP (4)
- WordXML (2)
- XML (12)
- 面试相关 (7)
- Tomcat (11)
- 性能与调优 (29)
- 职业发展 (2)
- 操作系统 (7)
- AJAX (2)
- DWR (1)
- Eclipse (12)
- 持续集成 (3)
- 批处理命令 (1)
- Mozilla Rhino (2)
- 新鲜技术 (18)
- Apache mina (2)
- 底层技术 (18)
- Linux (22)
- 新鲜技术,IT历史 (1)
- 敏捷开发 (1)
- 版本控制 (5)
- 较火技术 (7)
- 集群 (2)
- Web前端 (13)
- 报表工具 (3)
- 网站架构 (5)
- 大数据 (8)
- 分布式存储 (5)
- 云计算 (8)
- TCP/IP协议 (1)
- 负载均衡 (3)
- 硬件 (1)
- 表现层技术 (3)
- Velocity (3)
- jvm (6)
- 并发编程 (10)
- hadoop (8)
- 数据结构和算法 (12)
- 计算机原理 (1)
- 测试驱动开发-TDD (3)
- 开发技巧 (1)
- 分词器 (1)
- 项目构建工具 (2)
- JMX (4)
- RMI (1)
- 测试技术 (22)
- 网络完全 (1)
- Git (4)
- apache开源包 (4)
- Java常用 (1)
- mock (2)
- OSGi (2)
- MongoDB (1)
- JBPM (1)
- Storm (3)
- mysql (2)
- telnet (1)
- 正则表达式 (1)
- bootstrap (4)
- Apache ActiveMQ (1)
- redis (9)
- Nginx (2)
- rsync+inotify文件同步 (2)
- testng (1)
- 原型设计工具 (1)
- 工程能力 (1)
- 风险控制 (3)
- ibatis (1)
- 分布式 (4)
- 安全技术 (1)
- 计算机基础 (4)
- 消息中间件 (1)
- UML (2)
最新评论
-
u012236967:
java命令执行jar包(里面的main函数)的方式(包括依赖其它的jar包问题) -
世界尽头没有你:
Selenium自动化测试从入门到精通(Java版)百度网盘地 ...
自动化测试工具 Selenium WebDriver 入门教程(针对主流浏览器) -
小小西芹菜:
我喜欢代码简洁易读,服务稳定的推送服务,前段时间研究了一下go ...
dwr实现Reverse Ajax推送技术的三种方式 -
hellozhouqiao:
楼主,请教一点问题.现在我们需要在excel 的页脚里面加上图 ...
FreeMaker + xml 导出word(处理目录,图片和页眉页脚问题) -
乱在长安:
使用Timer会有各种各样的问题好嘛?!书上推荐使用Sched ...
DelayQueue (ScheduledThreadPoolExecutor调度的实现)
现在java编程中经常碰到ClassCastException 错误,ClassCastException 是 JVM 在检测到两个类型间的转换不兼容时引发的运行时异常。此类错误通常会终止用户请求。本模式试图为您提供了解和排除 ClassCastException 错误最常见成因的一些基本要素。
为什么发生此问题?
在执行几乎任何子系统(Web 容器、EJB、JCA、群集等)的应用程序代码或 WebLogic Server 代码内均可能发生 ClassCastException。通过转换,可以指示 Java 编译器将给定类型的变量作为另一种变量来处理。对基础类型和用户定义类型都可以进行转换。Java 语言规范定义了允许的转换,其中的大多数可在编译时进行验证。不过,某些转换还需要运行时验证。如果在此运行时验证过程中检测到不兼容,JVM 就会引发 ClassCastException。
假设有一个 S 类型的对象,我们想把它转换为 T 类型。
...
T t = (T) s;
如果存在以下情况,上述转换就可能引发 ClassCastException
- S 与 T 不兼容。规范规定:“当应用程序代码尝试将某一对象转换为某一子类时,如果该对象并非该子类的实例,JVM 就会抛出 ClassCastException。”以下是一个示例代码,执行该代码时将会引发此类错误:
public class TestCCE {
public static void main(String args[]) {
Object obj = new Object();
String s = (String) obj;
}
} - S 类型和 T 类型兼容,但加载时使用了不同的 ClassLoader。
返回页首什么是 ClassLoader?
ClassLoader 是允许 JVM 查找和加载类的一种 Java 类。JVM 有内置的 ClassLoader。不过,应用程序可以定义自定义 ClassLoader。应用程序定义新的 ClassLoader 通常有两个主要目的:
- 自定义和扩展 JVM 加载类的方式。例如:增加对新的类库(网络、加密文件等)的支持
-
划分 JVM 名称空间,避免名称冲突。举例来说,利用划分技术可同时运行同一应用程序的多个版本(基于空间的划分)。此项技术在应用程序服务器(如 WebLogic Server)内的另一个重要用途是启用应用程序热重新部署,即在不重新启动 JVM 的情况下启动应用程序的新版本(基于时间的划分)。
ClassLoader 按层级方式进行组织。除系统 Boot ClassLoader 外,其它 ClassLoader 都必须有父 ClassLoader。http://e-docs.bea.com/wls/docs81/programming/classloading.html (English) 中提供了对 WebLogic 类加载体系结构的说明。
理解类加载的关键
记住以下内容会有帮助:
- 永远无法在同一 ClassLoader 中重新加载类:“热重新部署”需要使用新的 ClassLoader。每个类对其 ClassLoader 的引用都是不可变的:this.getClass().getClassLoader()
- 在加载类之前,ClassLoader 始终会先询问其父 ClassLoader(委托模型)。这意味着将永远无法重写“核心”类
- 同级 ClassLoader 间互不了解
- 由不同 ClassLoader 加载的同一类文件也会被视为不同的类,即便每个字节都完全相同。这是 ClassCastException 的一个典型成因。
- 可以使用 Thread.setContextClassloader(cl) 将 ClassLoader 连接到线程的上下文
诊断
通常可以在服务器的日志和/或客户端获得完整的 ClassCastException 堆栈跟踪。该堆栈应能使您对涉及的 WebLogic Server 子系统的情况有相当深入的了解。请根据这些信息确认该问题是否与某个已知 WebLogic Server 问题的情况相符。如果相符,请使用相应的解决办法。
如果错误与所有已知问题的情况均不相符,则需要做进一步探查。如果错误出现在您可以编辑和编译源代码的类中,以下方法可能有助于您理解该问题。
假设出现错误的代码行类似于:
如果按照转换规则该转换应该有效,但仍然引发了 ClassCastException,则可能的情况是:类“bar”和“Foo”是由不同的 ClassLoader 加载的。要验证这一点,请像下面这样拆分该代码行:
System.err.println("The object " + o + " classloader is " +
o.getClass().getClassLoader());
System.err.println("Class Foo class loader is " +
Foo.class.getClassLoader());
Foo f = (Foo) o;
典型的输出可能与此类似:
sun.misc.Launcher$AppClassLoader@b9d04
Class Foo classloader is
weblogic.utils.classloaders.ChangeAwareClassLoader@5998cb finder:
weblogic.utils.classloaders.MultiClassFinder@7c2528
下一步是探查为什么涉及了不同的 ClassLoader。请执行下列检查清单中的各项检查:
- 检查应用程序打包情况,并检查“Foo”是否是使用由不同 ClassLoader 加载的不同模块打包而成。在这方面众所周知的一个成因是 Web 应用程序的“prefer-web-inf-classes”功能(请参阅已知的 WebLogic 问题)
- 检查它正在使用的应用程序代码或某个框架代码是否更改了 WebLogic 线程的上下文 ClassLoader,且在请求流程期间未将其还原。如果应用程序代码内有对 Thread.setContextClassloader(cl) 的调用,就可能存在这种情况。
-
如果上述所有措施均无济于事,请尝试将问题隔离在一个简单的、可重现的测试案例中,然后联系 BEA 技术支持部门,以做进一步探查。
已知的 WebLogic Server 问题
小程序
以下汇集了可导致 ClassCastException 错误的各种情况,您在使用各种 WebLogic 子系统时可能会遇到这些情况。
有关该情况的完整说明,请参考 http://e-docs.bea.com/wls/docs81/applets/usingapplets.html (English)
摘要:如果小程序中的 WebLogic Server 客户端尝试从 ClassLoader 获取某些资源信息,且一并使用了缓存标志和
codebase=/bea_wls_internal/classes
标志,就可能会抛出ClassCastException
。解决方法:
- 在将类路径 servlet 用作代码基时,请不要使用“cache_option”和“cache_archive”一类的缓存选项。
- 使用缓存选项时,请不要使用 /classes (ClasspathServlet) 做为代码基。如果要这样做,请先使用归档实用程序打包客户端 JAR。
JCA Connector
有关该情况的完整说明,请参考 http://e-docs.bea.com/wls/docs81/notes/issues.html (English)。
摘要:发出连接请求时,WebLogic Server 会返回一个代理对象,该对象通过资源适配器将连接对象封装后返回到客户端。WebLogic Server 使用该代理来提供一些功能,帮助应用程序使用 WebLogic Server 的“J2EE 连接器体系结构”实现。这些功能包括 (1) 连接泄漏检测功能和 (2) 连接请求在启动使用该连接的全局事务之前发出时,推迟 XAResource 登记。
如果将连接请求返回的连接对象向原始的
Connection
类进行了转换,就可能发生ClassCastException
。导致该异常的对象不外乎在连接请求过程中:(1) 资源适配器进行转换时或 (2) 客户端进行转换时。在 WebLogic Server 8.1 SP2 中,尝试检测由上述资源适配器情况 (1) 导致的
ClassCastException
。如果服务器检测到该转换失败,将关闭代理包装器功能,并在连接请求期间返回连接对象(不进行包装)。服务器会记录一条警告消息,说明代理包装器已被关闭。出现此类转换故障时,连接泄漏检测和 XAResource 推迟登记功能也将被关闭(但当前在控制台监视中并不会就此给出任何指示)。WebLogic Server 尝试以使用容器管理的安全性的客户端身份检测
ClassCastException
。如果要这样做,则部署的资源适配器须定义安全性 Credential。如果客户端在执行转换时发生
ClassCastException
,可按如下方式修改客户(客户端)代码:解决方法:如果客户端将连接对象转换为
MyConnection
,而不是将MyConnection
作为实现资源适配器的Connection
接口的一个类,请将该对象修改为一个扩展Connection
的接口。实现一个用于实现MyConnection
接口的MyConnectionImpl
类。Servlet 动态重新加载
有关该情况的完整说明,请参考 http://e-docs.bea.com/wls/docs81/jsp/reference.html (English)
摘要:要在会话过程中动态重新加载 servlet 或 JSP,servlet 会话中存储的对象必须是可序列化的。需要进行序列化是因为,servlet 是使用新的 ClassLoader 重新加载的,而这会导致此前加载的所有类(旧版本 servlet 中的类)与使用新的 ClassLoader 加载的所有类(新版本 servlet 类)发生不兼容的情况。这种不兼容会导致 servlet 返回 ClassCastException 错误。
使用 Prefer-web-inf-classes 功能
有关该情况的完整说明,请参考 http://e-docs.bea.com/wls/docs81/programming/classloading.html (English)
摘要:weblogic.xml Web 应用程序部署描述符包含一个 prefer-web-inf-classes 元素(container-descriptor 元素的子元素)。缺省情况下,此元素设置为 False。如果将此元素设置为 True,则不遵循 ClassLoader 委托模型,从而使 Web 应用程序中的类定义的加载顺序优先于更高级别的 ClassLoader 中的类定义。这样 Web 应用程序就可使用其自己版本的第三方类,该类也可能是 WebLogic Server 的一部分。请参阅 weblogic.xml Deployment Descriptor Elements (English)。
使用该功能时,必须注意不要混淆使用 Web 应用程序的类定义创建的实例与使用服务器的定义创建的实例。如果混淆了此类实例,就会发生 ClassCastException。
群集:在 http 会话中存储包含 EJBObject 的自定义对象 - CR102119
摘要:可序列化的自定义对象会包装 EJBObject(对 EJB 的引用)。该自定义对象存储在 http 会话中。会话复制时,这种设计就会导致 ClassCastException。
解决方法:在以后版本的 WebLogic Server 中将彻底解决该问题。目前的解决办法是在包装器内存储 EJB 句柄(而不是 EJBObject)。群集:Failover 后使用 http 会话中的 EJB 句柄 - CR187062
摘要:在群集中分别部署 webApp 和 EJB。EJB 句柄
- 在将类路径 servlet 用作代码基时,请不要使用“cache_option”和“cache_archive”一类的缓存选项。
包装在可序列化的自定义对象中,而该对象存储在 http 会话中。Failover 后,通过句柄访问 EJB 就会发生 ClassCastException。
解决方法:在同一个 ear 文件中包装 webApp 和 EJB。该问题存在于 WLS 8.1sp2 中,目前正在等待更正。
需要更多帮助?
如果您已经理解这个模式,但仍需要更多帮助,您可以:- 在 http://support.bea.com/ 上查询 AskBEA(例如,使用“ClassCastException”),以查找其它已发布的解决办法。
- 在 http://forums.bea.com/ 上,向 BEA 的某个新闻组提出更详细具体的问题。
如果这还不能解决您的问题,并且您拥有有效的技术支持合同,您可以通过登录以下网站来打开支持案例:http://support.bea.com/。
发表评论
-
Java SE7新特性之二进制字面量
2016-12-14 22:53 825Java SE 7中, 整数类型(byte, shor ... -
浮点数为什么不精确?为什么银行的金额不能用浮点数计算
2016-12-14 22:52 2012浮点数为什么不精确? 其实这句话本身就不精确, 相对精确一 ... -
计算机是如何计算乘法除法的(实际上都是转换为二进制加法计算)
2016-12-14 22:46 6626http://blog.csdn.net/blues1021 ... -
什么是补码、反码、负数在计算中如何表示
2016-12-14 22:39 920负数在计算机中如何表 ... -
Math.abs()绝对值取到的数不一定是正数
2016-12-14 22:37 1261Math.abs() 注释:Note that if th ... -
用BigInteger实现大素数生成算法
2016-12-06 16:42 1863转自:http://www.cnblogs.co ... -
加密(AES)、公私钥(PKI)、摘要(DIGEST)、签名(SIGNATURE)、证书(CERT)的形象解释和组合用法
2016-09-15 18:19 94071.鲍勃有两把钥匙,一把是公钥,另一把是私钥。 ... -
RSA加密公私钥生成工具(openssl)
2016-09-15 13:00 1186https://www.openssl.org/source/ ... -
RPC原理详解
2016-06-23 20:47 577RPC 功能目标 RPC 的主要功能目标是让构建分布式计算 ... -
Java并发之CountDownLatch、CyclicBarrier和Semaphore
2016-06-23 20:36 1408这次说一下 JUC 中的同步器三个主要的成员:CountDo ... -
线程间协作的两种方式:wait、notify、notifyAll和Condition
2016-06-23 20:35 575在前面我们将了很多关于同步的问题,然而在现实中,需要线程之 ... -
The final local variable xxx cannot be assigned, since it is defined in an enclo
2016-04-24 17:42 1592本文就自己编程时候遇到的一个问题,简要描述一下,并提出解决 ... -
一个奇葩的excel中无法trim的“空格”的问题
2016-03-29 16:21 1925太奇怪了。打印出来的命名是空格,就是 trim() 不管用。 ... -
List深度复制
2016-02-17 09:34 2677昨天弄了一个类似List<Map<String, ... -
Eclipse导入 jar 源码乱码问题
2015-12-15 19:43 871http://blog.csdn.net/laiwenqian ... -
Java高并发编程的各种陷阱
2015-07-25 17:49 1000www.iteye.com/blogs/subjects/ja ... -
ASM介绍(java字节码操作利器)
2015-06-10 20:46 4358转自:http://www.ibm.com/de ... -
JDK 7 中的 Fork/Join 模式(并发处理)
2015-06-03 19:47 1001转自:http://www.ibm.com/dev ... -
Java常见内存溢出异常分析
2015-06-03 16:36 827转自:http://www.iteye.com/news/3 ... -
dom4j解析带有命名空间的xml
2015-04-09 21:23 5527Element rootEle = resultDoc.g ...
相关推荐
当我们在使用WebLogic时,可能会遇到各种问题,其中之一就是"weblogic解决clob添加失败 classcastexception"。这个问题通常发生在尝试向数据库中的CLOB(Character Large Object)类型字段写入数据时,由于类型转换...
在Java编程中,`java.lang.ClassCastException`是一个运行时异常,通常发生在强制类型转换时,如果尝试将一个对象转换为其非兼容类型时就会抛出。这个异常表明在编译时可能成功的类型转换,在运行时被证明是错误的。...
然而,有时在使用XMLBeans时,我们可能会遇到`ClassCastException`,这是由于类型不匹配导致的运行时异常。 当我们在解析XML文档时,特别是涉及到多个不带命名空间的XSD文件,可能会遇到类型冲突的情况。这是因为...
然而,在实现ListView时,我们可能会遇到一个问题,即加载不同布局导致的`ClassCastException`异常。这个异常通常出现在尝试将一个对象强制转换为非兼容类型时,对于ListView,可能是由于在适配器中错误地处理了视图...
tomcat6使用DBCP和blob出现ClassCastException解决方法
### Hive的一些报错及解决方法 #### 一、Hive连接报错 在更换网络接口卡后重新启动服务时,可能会遇到Hive连接失败的问题。此类问题通常与元数据存储中的异常有关,例如存在多个版本的元数据或者端口被其他服务...
Apache POI 是一个开源项目,专门用于处理Microsoft Office格式的文件,如Word、Excel和PowerPoint。这个"poi office操作工具4.0.0jar包"是Apache POI的一个特定版本,提供了在Java环境中对Office文档进行读写操作的...
在Android开发中,Gson库是一个非常常用的工具,...参考博文:[链接](https://ujs-lifazhu.iteye.com/blog/1750820)提供了更多关于在Android项目中处理Gson混淆问题的详细步骤和示例,建议详细阅读以获取更深入的理解。
然而,在实际应用中,使用devtools可能会遇到类型转换异常(ClassCastException)的问题,尤其是在结合使用Shiro进行会话管理时,如果会话存储方式采用Redis,问题尤为明显。本文将详细介绍导致这一异常的原因以及...
在Java编程中,XML(可扩展标记语言)是一种被广泛用于数据存储和交换的格式。为了处理XML文档,Java提供了多种API,其中最常用的包括DOM、SAX、DOM4J和JDOM。以下是对这些方法的详细介绍: 1. DOM(Document ...
**类型转换**是Java编程中的常见操作,但是不安全的类型转换会导致`ClassCastException`。当试图将一个对象强制转换为它实际上不是的类型时,就会抛出这个异常。在你的例子中,`MorphDynaBean`不能被转换为`xxx`,...
在Android开发中,PopupWindow是一个非常实用的组件,它可以用于创建弹出式窗口,提供临时性的用户交互。本文将深入探讨如何在Android中简单封装一个精美、易用的菜单型PopupWindow,以满足用户界面的需求。...
ClassCastException 示例 类转换异常的示例。 这是此 Repo 中的完整代码: public class SomeGeneric <T> { @SuppressWarnings ( " unchecked " ) public T getFirst () { return ( T ) new Integer ( - 9999 )...
java.lang.ClassCastException: org.springframework.web.SpringServletContainerInitializer cannot be cast to javax.servlet.ServletContainerInitializer 出现这个报错的原因是 javax.servlet-api 在运行时将 ...
1. 类型安全:泛型可以在编译期检查类型的正确性,避免了 ClassCastException。 2. 代码重用:泛型可以将类型参数化,使得代码可以应用于多种类型。 3. 代码简洁:泛型可以减少类型转换的代码,使得代码更加简洁。 ...
泛型的引入解决了Java集合的缺陷,即集合会“忘记”对象的类型,导致ClassCastException。 泛型的优点: 1. 类型安全:泛型可以在编译时检查类型的正确性,避免了ClassCastException。 2. 代码复用:泛型可以使得...
根据给定文件的信息,我们可以深入探讨SCJP 310-055考试中的异常处理和断言相关知识点。...此外,我们也学习了类型转换的规则以及`ClassCastException`的发生条件,这对于理解和编写健壮的Java代码至关重要。
二:保证 ImageCycleView的 父布局是LinearLayout 否则可能会报异常,比如 java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.widget.RelativeLayout$...
这意味着,当向集合添加元素时,必须进行强制类型转换,这可能会导致运行时的`ClassCastException`。 #### 二、Java泛型的引入背景 在Java 1.4及之前的版本中,所有的集合类根接口为`Collection`。例如,在没有...