作者:Flyingis
ClassCastException是JVM在检测到两个类型间转换不兼容时引发的运行时异常。此类错误通常会终止用户请求。在执行任何子系统的应用程序代码时都有可能发生ClassCastException异常。通过转换,可以指示Java编译器将给定类型的变量作为另一种变量来处理。对基础类型和用户定义类型都可以转换。Java语言规范定义了允许的转换,其中大多数可在编译时进行验证。不过,某些转换还需要运行时验证。如果在此运行时验证过程中检测到不兼容,JVM就会引发ClassCastException异常。例如:<!----><o:p></o:p>
Fruit f;<o:p></o:p>
Apple a = (Apple)f;<o:p></o:p>
当出现下列情况时,就会引发ClassCastException异常:<o:p></o:p>
1. Fruit和Apple类不兼容。当应用程序代码尝试将某一对象转换为某一子类时,如果该对象并非该子类的实例,JVM就会抛出ClassCastException异常。<o:p></o:p>
2. Fruit和Apple类兼容,但加载时使用了不同的ClassLoader。这是这种异常发生最常见的原因。在这里,需要了解一下什么是ClassLoader?
<o:p></o:p>
ClassLoader<o:p></o:p>
ClassLoader是允许JVM查找和加载类的一种Java类。JVM有内置的ClassLoader。不过,应用程序可以定义自定义的ClassLoader。应用程序定义新的ClassLoader通常出于以下两种原因:<o:p></o:p>
1. 自定义和扩展JVM加载类的方式。例如,增加对新的类库(网络、加密文件等)的支持。<o:p></o:p>
2. 划分JVM名称空间,避免名称冲突。例如,可以利用划分技术同时运行同一应用程序的多个版本(基于空间的划分)。此项技术在应用服务器(如WebLogic Server)内的另一个重要用途是启用应用程序热重新部署,即在不重新启动JVM的情况下启动应用程序的新版本(基于时间的划分)。<o:p></o:p>
ClassLoader按层级方式进行组织。除系统BootClassLoader外,其它ClassLoader都必须有父ClassLoader。<o:p></o:p>
在理解类加载的时候,需要注意以下几点:<o:p></o:p>
1. 永远无法在同一ClassLoader中重新加载类。“热重新部署”需要使用新的ClassLoader。每个类对其ClassLoader的引用都是不可变的:this.getClass().getClassLoader()。<o:p></o:p>
2. 在加载类之前,ClassLoader始终会先询问其父ClassLoader(委托模型)。这意味着将永远无法重写“核心”类。<o:p></o:p>
3. 同级ClassLoader间互不了解。<o:p></o:p>
4. 由不同ClassLoader加载的同一类文件也会被视为不同的类,即便每个字节都完全相同。这是ClassCastException的一个典型原因。<o:p></o:p>
5. 可以使用Thread.setContextClassLoader(a)将ClassLoader连接到线程的上下文。<o:p></o:p>
基于以上的基本原理,可以加深大家对ClassCastException的理解,和在碰到问题时提供一种解决问题的思路。<o:p></o:p>
<o:p> </o:p>
参考文献:<o:p></o:p>
dev2dev专刊 2005年 第二期<o:p></o:p>
j2sdk-1_5_0-doc
分享到:
相关推荐
解决weblogic在使用数据源 向数据库的clob类型字段写入内容的问题
ebean,sbean,dto
ListView加载不同布局.解决异常ClassCastException
tomcat6使用DBCP和blob出现ClassCastException解决方法
hive的一些报错及解决方法:连接报错、执行脚本卡住、内存溢出报错、表死锁问题
用xmlbeans解析两个或两个以上不带namespace的xsd文件,调用出现类型转换异常解决方案。注意看总结。
apache poi 操作office文档的,linux和windows双版本。仅仅是记录一下自己使用过的资源。
Java 四种方式操作xml,包括xml,dom,sax,jdom这四种方式的一个简单例子。
简单封装一个精美、好用的菜单型PopupWindow
scjp模拟考题 给出: 1. public class Test { 2. public static void main(String args[]) { 3. class Foo { 4. public int i = 3; 5. } 6. Object o = (Object)new Foo();... 在第七行抛出ClassCastException异常.
ClassCastException 示例 类转换异常的示例。 这是此 Repo 中的完整代码: public class SomeGeneric <T> { @SuppressWarnings ( " unchecked " ) public T getFirst () { return ( T ) new Integer ( - 9999 )...
二:保证 ImageCycleView的 父布局是LinearLayout 否则可能会报异常,比如 java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.widget.RelativeLayout$...
ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException...
cannot be cast to javax.servlet.Filter 报错, 原因servlet-api.jar冲突 使用maven开发web应用程序, 启动的时候报错: jar not loaded....java.lang.ClassCastException: org.springframework.web.f
butterknife butterknife-parent butterknife-sample Fix: Correct ClassCastException which occurred when @Nullable array bindings had missing views.
weblogic下转换oracle 的clob类型经常报转型错误,本例子通过反射解决weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB转型成oracle.sql.CLOB问题
oRuntimeException:运行时异常,也叫非检查异常(NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException、ArithmeticException),会由Java虚拟机自动抛出并自动捕获,此类异常的出现绝大数...
Registering type handler against HashMap causes ClassCastException. #1089 Unable to register TypeHandler once TypeHandlerRegistry.hasTypeHandler is called. #1177 Serializing and deserializing cached...
“大小”)会导致ClassCastException。# 1031 不是所有的结果集都在更新或插入时被处理。# 1036 使用PostgreSQL,如果在全局启用使用通用键,则会抛出ExecutorException。# 902 从3.4.4开始,应该没有向后兼容的...
主要介绍了 java.util.ConcurrentModificationException 解决方法的相关资料,需要的朋友可以参考下