ClassCastException是如何产生的
Java异常面试题 33道
![Java异常面试题 33道](https://img.taocdn.com/s3/m/e9e3d06c28ea81c759f57825.png)
Java异常架构与异常关键字1. Java异常简介Java异常是Java提供的一种识别及响应错误的一致性机制。
Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。
在有效使用异常的情况下,异常能清晰的回答what, where, why这3个问题:异常类型回答了“什么”被抛出,异常堆栈跟踪回答了“在哪”抛出,异常信息回答了“为什么”会抛出。
2. Java异常架构1. ThrowableThrowable 是 Java 语言中所有错误与异常的超类。
Throwable 包含两个子类:Error(错误)和 Exception(异常),它们通常用于指示发生了异常情况。
Throwable 包含了其线程创建时线程执行堆栈的快照,它提供了 printStackTrace() 等接口用于获取堆栈跟踪数据等信息。
2. Error(错误)定义:Error 类及其子类。
程序中无法处理的错误,表示运行应用程序中出现了严重的错误。
特点:此类错误一般表示代码运行时 JVM 出现问题。
通常有 Virtual MachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误)等。
比如 OutOfMemoryError:内存不足错误;StackOverflowError:栈溢出错误。
此类错误发生时,JVM 将终止线程。
这些错误是不受检异常,非代码性错误。
因此,当此类错误发生时,应用程序不应该去处理此类错误。
按照Java惯例,我们是不应该实现任何新的Error子类的!3. Exception(异常)程序本身可以捕获并且可以处理的异常。
Exception 这种异常又分为两类:运行时异常和编译时异常。
运行时异常定义:RuntimeException 类及其子类,表示 JVM 在运行期间可能出现的异常。
特点:Java 编译器不会检查它。
也就是说,当程序中可能出现这类异常时,倘若既"没有通过throws声明抛出它",也"没有用try-catch语句捕获它",还是会编译通过。
Java开发中的常见错误及解决方法
![Java开发中的常见错误及解决方法](https://img.taocdn.com/s3/m/5812d25ea55177232f60ddccda38376baf1fe020.png)
Java开发中的常见错误及解决方法在Java开发中,开发者可能会遇到许多常见的错误。
这些错误可能来自于语法错误、逻辑错误或者编码风格等不同的方面。
今天,我们就来一起探讨Java开发中常见的错误以及如何解决这些问题。
一、空指针异常(NullPointerException)空指针异常是一个极为常见的错误,很容易发生。
这个错误通常发生在访问一个空对象或者调用一个空对象的方法时发生。
在Java中,如果变量没有被初始化或者设置为null,其值就为空。
解决方案:1. 检查变量是否被正确初始化或者设置为null;2. 使用if判空语句来避免空指针异常的发生;3. 使用Objects类中的requireNonNull方法,可以在变量为空的时候抛出异常,防止出现空指针异常的情况,例如:public void showData(String data){Objects.requireNonNull(data,"data must not be null");//do something...}二、数组越界异常(ArrayIndexOutOfBoundsException)如果在访问数组时访问了数组的不存在的元素,或者使用负数的下标来访问数组,就会抛出数组越界异常。
对于数组的访问,必须保证数组下标越界。
解决方案:1. 检查数组下标是否越界;2. 尽可能使用for-each循环,可以保证不会越界;三、类型转换异常(ClassCastException)类型转换异常是因为试图将一个对象转换为不相关的对象类型而导致的异常。
在Java中,如果试图将一个子类实例转换为父类对象时,不需要进行任何显式的类型转换操作。
但是,将一个父类实例转换为一个子类时,就需要使用强制类型转换操作。
解决方案:1. 确保转换类型之前,先用instanceof判断对象类型;2. 避免在不相关对象类型之间进行强制类型转换操作;四、算术异常(ArithmeticException)算术异常通常发生在程序试图除以0的情况下。
Java常见异常(RuntimeException)详细介绍并总结
![Java常见异常(RuntimeException)详细介绍并总结](https://img.taocdn.com/s3/m/f40c380554270722192e453610661ed9ad51554a.png)
Java常见异常(RuntimeException)详细介绍并总结本⽂重在Java中异常机制的⼀些概念。
写本⽂的⽬的在于⽅便我很长时间后若是忘了这些东西可以通过这篇⽂章迅速回忆起来。
1. 异常机制1.1 异常机制是指当程序出现错误后,程序如何处理。
具体来说,异常机制提供了程序退出的安全通道。
当出现错误后,程序执⾏的流程发⽣改变,程序的控制权转移到异常处理器。
1.2 传统的处理异常的办法是,函数返回⼀个特殊的结果来表⽰出现异常(通常这个特殊结果是⼤家约定俗称的),调⽤该函数的程序负责检查并分析函数返回的结果。
这样做有如下的弊端:例如函数返回-1代表出现异常,但是如果函数确实要返回-1这个正确的值时就会出现混淆;可读性降低,将程序代码与处理异常的代码混爹在⼀起;由调⽤函数的程序来分析错误,这就要求客户程序员对库函数有很深的了解。
1.3 异常处理的流程1.3.1 遇到错误,⽅法⽴即结束,并不返回⼀个值;同时,抛出⼀个异常对象1.3.2 调⽤该⽅法的程序也不会继续执⾏下去,⽽是搜索⼀个可以处理该异常的异常处理器,并执⾏其中的代码2 异常的分类2.1 异常的分类2.1.1 异常的继承结构:基类为Throwable,Error和Exception继承Throwable,RuntimeException和IOException等继承Exception,具体的RuntimeException继承RuntimeException。
2.1.2 Error和RuntimeException及其⼦类成为未检查异常(unchecked),其它异常成为已检查异常(checked)。
2.2 每个类型的异常的特点2.2.1 Error体系 Error类体系描述了Java运⾏系统中的内部错误以及资源耗尽的情形。
应⽤程序不应该抛出这种类型的对象(⼀般是由虚拟机抛出)。
如果出现这种错误,除了尽⼒使程序安全退出外,在其他⽅⾯是⽆能为⼒的。
Java的throw和throws
![Java的throw和throws](https://img.taocdn.com/s3/m/3907b3ff941ea76e59fa0400.png)
catch (Exception e)
{
System.out.println("catch块处理了Rutime异常");
}
}
public static void main(String[] rags)
{
new A().set();
}
}
2、不做任何处理(即交给Java虚拟机处理,处理结果:打印异常跟踪栈信息后终止程序运行),如下文的例子三就没有处理。
1、用try{} catch{}捕获处理抛出的异常,如下class A:
class A
{ void setFra bibliotek) {
try
{
// 抛出一个Runtime异常
// new RuntimeException():构造一个详细信息为null的新运行时异常实例
throw new RuntimeException();
情况二:如果抛出的是Checked异常,则必须处理,也有两种处理方式:=====================================情况二
1、调用抛出了异常的方法时,将这个方法调用语句放入try块中显式捕获该异常,如下文的例子一;
2、将调用这个方法(抛出了异常的方法)的方法用throws声明抛出异常,如下文的例子二。
例子三:throw语句抛出Runtime异常,所在方法可以不理会,不抛出异常==========================================例子三(class D)
import javax.swing.JOptionPane;
class D
{
void set()//-------------与例子二不同处,可以不声明抛出,不做异常处理
ClassCastException错误解析
![ClassCastException错误解析](https://img.taocdn.com/s3/m/db0030ff9e3143323968937f.png)
ClassCastException 错误解析现在Java编程中经常碰到ClassCastException 错误,ClassCastException 是 JVM 在检测到两个类型间的转换不兼容时引发的运行时异常。
此类错误通常会终止用户请求。
本模式试图为您提供了解和排除 ClassCastException 错误最常见成因的一些基本要素。
为什么发生此问题?在执行几乎任何子系统(web 容器、EJB、JCA、群集等)的应用程序代码或 WebLogic Server 代码内均可能发生 ClassCastException。
通过转换,可以指示 Java 编译器将给定类型的变量作为另一种变量来处理。
对基础类型和用户定义类型都可以进行转换。
Java 语言规范定义了允许的转换,其中的大多数可在编译时进行验证。
不过,某些转换还需要运行时验证。
如果在此运行时验证过程中检测到不兼容,JVM 就会引发 ClassCastException。
假设有一个 S 类型的对象,我们想把它转换为 T 类型。
S s;…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。
第二个原因实际上是这种错误最常见的原因。
这种情况在诊断上有相当的难度,而且需要对 Java 类加载以及 WebLogic 类加载体系结构方面的基础知识有一定程度的了解。
类型转换异常
![类型转换异常](https://img.taocdn.com/s3/m/d2311f32580216fc700afdbc.png)
ClassCastException,从字面上看,是类型转换错误,通常是进行强制类型转换时候出的错误。
下面对产生ClassCastException异常的原因进行分析,然后给出这种异常的解决方法。
这种异常是如何产生的呢?举一个比较形象的例子。
Animal表示动物,Dog表示狗,是动物的子类,Cat表示猫,是动物的子类。
看下面的代码:Animal a1 = new Dog(); // 1Animal a2 = new Cat(); // 2Dog a1 = (Dog)a1; //3Dog a2 = (Dog)a2; //4第3行代码和第4行代码基本相同,从字面意思看都是把动物(Animal)强制转换为狗(Dog),但是第4行代码将产生ng.ClassCastException。
原因是你要把一个猫(a2这只动物是猫)转换成狗,而第3行中是把狗转换成狗,所以可以。
从上面的例子看,ng.ClassCastException是进行强制类型转换的时候产生的异常,强制类型转换的前提是父类引用指向的对象的类型是子类的时候才可以进行强制类型转换,如果父类引用指向的对象的类型不是子类的时候将产生ng.ClassCastException异常。
就是上面a1和a2都是动物,但是a1这只动物是一只狗,而a2这只动物是猫,所以要把a1转换成狗可以,因为a1本身就是狗,而a2是一只猫,所以要转换成狗就出错了。
遇到这样的异常的时候如何解决呢?如果你知道要访问的的对象的具体类型,直接转换成该类型即可。
如果不能确定类型可以通过下面的两种方式进行处理(假设对象为o):1、通过o.getClass().getName()得到具体的类型,可以通过输出语句输出这个类型,然后根据类型进行进行具体的处理。
2、通过if(o instanceof 类型)的语句来判断o的类型是什么。
Java中java.lang.ClassCastException异常原因及解决方法
![Java中java.lang.ClassCastException异常原因及解决方法](https://img.taocdn.com/s3/m/1a4ba40053d380eb6294dd88d0d233d4b14e3f65.png)
Java中ng.ClassCastException异常原因及解决⽅法通常我们在 OOP 设计中都会使⽤到继承。
但是在继承对象之间的强制转换可能会遇到j ng.ClassCastException异常的错误。
错误的⽇志如下:19:58:25.010 [http-nio-8080-exec-5] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is ng.ClassCastException: class com.oss ng.ClassCastException: class mon.models.response.ListingResponse cannot be cast to class mon.models.response.ListingDetailResponse (mon.models.response.ListingR问题和原因问题和原因这个问题出现的原因就是继承类之间强制转换的错误。
同时这个错误是运⾏时错误,不是编译错误,因此你编译的时候是没有这个错误的。
考察下⾯的代码:Parent b = new parent();Child c = (Child) b ;采⽤该⽅法不能实现对象类型由超类向⼦类的转换。
上⾯的原因是⽗类的对象是由⽗类创建的,然后你尝试将⽗类创建的对象强制转换到⼦类中。
因为⽗类创建的对象和⼦类需要创建的对象分别使⽤不同的地址空间,那在转换的时候将会出现地址空间引⽤的错误,因此 JVM 会认为你将 2 个完全不同类型的对象进⾏转换,这个时候出现上⾯的运⾏时错误。
交行笔试题20130904
![交行笔试题20130904](https://img.taocdn.com/s3/m/465a831b55270722192ef769.png)
C./usr/Websphere/AppServer
D./usr/Websphere/AppServer/logs/Server1
15.Error与exception有什么区别?
Error表示系统级的错误和程序不必处理的异常,
Exception表示需要捕捉或者需要程序进行处理的异常。
13.领域模型是一组表示__ __,在设计工作中广泛用来启发设计软件对象.B
A.真实世界的概念类
B.虚拟世界的概念类
C.软件部件的模型
D.硬件部件的模型
14.AIX服务上WAS的默认实例的默认server1服务器上的应用出现了JavaCore时,该javaCore文件会存放在哪里?D
A./usr/Websphere
C. SMS能够把长型数据存放到单独的表空间中;DMS不能够把长型数据存放到单独的表空间中。
D. SMS仅在需要时才分配空间;DMS预先分配空间。
3.假定学生关系是S(S#, SNAME,SEX,AGE),课程关系是C (C#, CNAME,TEACHER),学生选课关系是SC(S#, C#, GRADE),要查找选修“COMPUTER”课程的女学生的姓名,将涉及关系(D)
try {
reader.close();
} catch (IOException e1) { }
}
}
}
20.利用Java泛型,申明一个方法get,能根据特定的类型和字符串name,返回对应的类型的对象(不需要实现内部的方法),并使得以下语句成立:
Dog dog = obj.get(Dog.class,”1”);
= "value";
解决java.lang.ClassCastException的java类型转换异常的问题
![解决java.lang.ClassCastException的java类型转换异常的问题](https://img.taocdn.com/s3/m/a60298f8e109581b6bd97f19227916888486b909.png)
解决ng.ClassCastException的java类型转换异常的问题在项⽬中,需要使⽤XStream将xml string转成相应的对象,却报出了ng.ClassCastException: com.model.test cannot be cast to com.model.test的错误。
原因:项⽬中应该是采⽤了热部署,devtools,因为累加载器的不同所以会导致类型转换失败措施:在pom.xml中将以下代码注释掉:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope></dependency>补充知识:TreeSet在add对象时报ClassCastException错误TreeSet实现了SortedSet接⼝,可以对集合中的对象进⾏排序,但是在使⽤TreeSet时要注意⼀点,那就是要给TreeSet传递⼀个⽐较器,也就是指定⽐较规则,否则的话,它就不知道谁⼤谁⼩,也就不能排序了。
此时它会报⼀个ClassCastException的异常。
jdk1.6⽂档⾥add⽅法关于这个异常是这样描述的:Throws:ClassCastException - if the specified object cannot be compared with the elements currently in this set翻译:ClassCastException - 如果指定的对象不能与当前在此集合中的元素进⾏⽐较public class TreeSetTest{public static void main(String[] args){MyComparator comparator = new MyComparator();// TreeSet<Student> set = new TreeSet<Student>(comparator);// 错误的代码,少了⽐较器,运⾏则报下⾯的异常。
Java异常ClassCastException的解决
![Java异常ClassCastException的解决](https://img.taocdn.com/s3/m/d7130f006fdb6f1aff00bed5b9f3f90f76c64d62.png)
Java异常ClassCastException的解决在说ClassCastException之前,先介绍下引⽤类型转换;引⽤类型转换分为向上转型和向下转型两种;向上转型:多态本⾝是⼦类类型向⽗类类型向上转换的过程,这个过程是默认的;当⽗类引⽤指向⼀个⼦类对象时,便是向上转换;使⽤格式:⽗类类型变量名 = new ⼦类类型(); 向下转型:⽗类类型向⼦类类型向下转换的过程,这个过程时强制;⼀个已经向上转型的⼦类对象,将⽗类引⽤转为⼦类引⽤,可以使⽤强制转换的格式,便是向下转换;使⽤格式:⼦类类型变量名 = (⼦类类型) ⽗类变量名; 转型的⽬的:当使⽤多态⽅式调⽤⽅法时,⾸先检查⽗类是否有该⽅法,如果没有,则编译错误,即⽗类不能调⽤⼦类拥有的,⽽⽗类没有的⽅法;编译都错误,更别说运⾏,要想调⽤⼦类特有的⽅法,必须做向下转型;转型⽰例代码:定义类:abstract class Animal {abstract void eat();}class Cat extends Animal {public void eat() {System.out.println("吃鱼");}public void catchMouse() {System.out.println("抓⽼⿏");}}class Dog extends Animal {public void eat() {System.out.println("吃⾻头");}public void watchHouse() {System.out.println("看家");}}测试类:public class Test {public static void main(String[] args) {// 向上转型Animal a = new Cat();// 调⽤的是 Cat 的 eata.eat();// 向下转型Cat c = (Cat)a;// 调⽤的是 Cat 的 catchMousec.catchMouse();// 向下转型Dog d = (Dog)a;// ClassCastException异常d.watchHouse();}}上⾯这段代码可以编译,但在运⾏时,会报ClassCastException异常;ClassCastException:当试图将对象强制转换为不是实例的⼦类时,抛出该异常;上⾯的测试类中创建了Cat类型对象,运⾏时不能转换成Dog对象的,这两个类型并没有任何继承关系,不符合类型转换的定义,因此会抛出ClassCastException异常;为了避免ClassCastException的发⽣,Java提供了 instanceof 关键字,给引⽤变量做类型的校验,格式如下:变量名 instanceof 数据类型如果变量属于该数据类型,返回true;如果变量不属于该数据类型,返回false;可以使⽤instanceof将上⾯的测试类修改如下:public class Test {public static void main(String[] args) {// 向上转型Animal a = new Cat();// 调⽤的是 Cat 的 eata.eat();// 向下转型if (a instanceof Cat) {Cat c = (Cat)a;c.catchMouse();} else if (a instanceof Dog) {Dog d = (Dog)a;d.watchHouse();}}}到此这篇关于Java异常ClassCastException的解决的⽂章就介绍到这了,更多相关Java异常ClassCastException内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持! 。
java中常见的五种异常
![java中常见的五种异常](https://img.taocdn.com/s3/m/ba1d19dcda38376baf1fae8b.png)
java中常见的五种异常1.ClassCastException(类转换异常)数据类型转换错误,比如有个String temp="abc"; 如果设为(int)temp就会报错了,因为它们类型不一样,但是设为(object)temp就可以,因为object是它们的父类2.IndexOutOfBoundsException(数组越界)这个异常我们在操作数组的时候会经常遇到,异常的解释是“数组下标越界“,现在程序中大多都有对数组的操作,因此在调用数组的时候一定要认真检查,看自己调用的下标是不是超出了数组的范围,一般来说,显示(即直接用常数当下标)调用不太容易出这样的错,但隐式(即用变量表示下标)调用就经常出错了,还有一种情况,是程序中定义的数组的长度是通过某些特定方法决定的,不是事先声明的,这个时候,最好先查看一下数组的length,以免出现这个异常。
3.NullPointerException(空指针)这个异常在编程时也经常遇到,异常的解释是“程序遇上了空指针“,简单地说就是调用了未经初始化的对象或者是不存在的对象,这个错误经常出现在调用数组这些操作中,对数组操作中出现空指针,很多情况下是一些刚开始学习编程的人常犯的错误,即把数组的初始化和数组元素的初始化混淆起来了。
数组的初始化是对数组分配需要的空间,而初始化后的数组,其中的元素并没有实例化,依然是空的,所以还需要对每个元素都进行初始化(如果要调用的话)。
4.IllegalAccessException(安全权限异常)这个异常的解释是“没有访问权限“,当应用程序要调用一个类,但当前的方法即没有对该类的访问权限便会出现这个异常。
对程序中用了Package的情况下要注意这个异常。
5. IOException(输入输出异常)一般读写文件会出现这个异常,比如你想从磁盘上读一个文件到你写的程序,如果硬盘上没有这文件,java虚拟机就会报这个异常(来源:北大青鸟上地软件园总校)。
常见的运行时异常如下
![常见的运行时异常如下](https://img.taocdn.com/s3/m/9b5fd2e2ba0d4a7302763ac0.png)
常见的运行时异常如下:(1) 类型转换异常ClassCastExceptionString strName=new string(“123”);int nNumber=(int)strName;(2) 数组超界异常ArrayIndexOutBoundsExceptionint[] b=new int[10];b[10]=1000;(3) 指定数组维数为负值异常NegativeArraySizeExceptionb[-1]=1001;(4) 算术异常ArithmeticExceptionint b=0;a=500/b;(5) Java系统内部异常InternalExceptionJVM抛出的异常。
(6) 类型不符合异常IncompatibleTypeExceptionint n=12345;String s=(String)n;(7) 内存溢出异常OutOfMemeoryException(8) 没有找到类定义异常NoClassDefFoundExceptionaClass aa=new aClas(); //但aClass类未定义。
(9) 空指针异常NullPointerExceptionint b[ ];b[0]=99; //没有实例化,就访问,将产生空指针。
常见的非运行时异常如下:(1) ClassNotFoundException :找不到类或接口所产生的异常(2) CloneNotSupportedException:使用对象的clone 方法但无法执行Cloneable 所产生的异常。
(3) IllegalAccessException :类定义不明确所产生的异常。
例如:类不为public ,或是包含一个类定义在另一个类库内。
(4) IOException :在一般情况下不能完成I/O操作所产生的异常。
(5) EOFException: 打开文件没有数据可以读取所产生的异常(6) FileNotFoundException :在文件系统中,找不到文件名称或路径所产生(7) InterruptedIOException:目前线程等待执行,另一线程中断目前线程I/O运行所产生的异常在Sun公司提供的各种API包中,如java.io,,java.awt等,都提供不同情况下可能产生的异常。
Exception子类
![Exception子类](https://img.taocdn.com/s3/m/b95db32e87c24028915fc3e8.png)
ArithmeticException——由于除数为0引起的异常;ArrayStoreException——由于数组存储空间不够引起的异常;ClassCastException—一当把一个对象归为某个类,但实际上此对象并不是由这个类创建的,也不是其子类创建的,则会引起异常;IllegalMonitorStateException——监控器状态出错引起的异常;NegativeArraySizeException—一数组长度是负数,则产生异常;NullPointerException—一程序试图访问一个空的数组中的元素或访问空的对象中的方法或变量时产生异常;OutofMemoryException——用new语句创建对象时,如系统无法为其分配内存空间则产生异常;SecurityException——由于访问了不应访问的指针,使安全性出问题而引起异常;IndexOutOfBoundsExcention——由于数组下标越界或字符串访问越界引起异常;IOException——由于文件未找到、未打开或者I/O操作不能进行而引起异常;ClassNotFoundException——未找到指定名字的类或接口引起异常;CloneNotSupportedException——一程序中的一个对象引用Object类的clone方法,但此对象并没有连接Cloneable接口,从而引起异常;InterruptedException—一当一个线程处于等待状态时,另一个线程中断此线程,从而引起异常,有关线程的内容,将在下一章讲述;NoSuchMethodException一所调用的方法未找到,引起异常;Illega1AccessExcePtion—一试图访问一个非public方法;StringIndexOutOfBoundsException——访问字符串序号越界,引起异常;ArrayIdexOutOfBoundsException—一访问数组元素下标越界,引起异常;NumberFormatException——字符的UTF代码数据格式有错引起异常;IllegalThreadException—一线程调用某个方法而所处状态不适当,引起异常;FileNotFoundException——未找到指定文件引起异常;EOFException——未完成输入操作即遇文件结束引起异常。
泛型常见面试题
![泛型常见面试题](https://img.taocdn.com/s3/m/4f82179f6aec0975f46527d3240c844769eaa09a.png)
泛型常见⾯试题1. Java中的泛型是什么 ? 使⽤泛型的好处是什么?这是在各种Java泛型中,⼀开场你就会被问到的问题中的⼀个,主要集中在初级和中级⾯试中。
那些拥有Java1.4或更早版本的开发背景的⼈都知道,在集合中存储对象并在使⽤前进⾏类型转换是多么的不⽅便。
泛型防⽌了那种情况的发⽣。
它提供了编译期的类型安全,确保你只能把正确类型的对象放⼊集合中,避免了在运⾏时出现ClassCastException。
2. Java的泛型是如何⼯作的 ? 什么是类型擦除 ?这是⼀道更好的泛型⾯试题。
泛型是通过类型擦除来实现的,编译器在编译时擦除了所有类型相关的信息,所以在运⾏时不存在任何类型相关的信息。
例如 List<String>在运⾏时仅⽤⼀个List来表⽰。
这样做的⽬的,是确保能和Java 5之前的版本开发⼆进制类库进⾏兼容。
你⽆法在运⾏时访问到类型参数,因为编译器已经把泛型类型转换成了原始类型。
根据你对这个泛型问题的回答情况,你会得到⼀些后续提问,⽐如为什么泛型是由类型擦除来实现的或者给你展⽰⼀些会导致编译器出错的错误泛型代码。
请阅读我的Java中泛型是如何⼯作的来了解更多信息。
3. 什么是泛型中的限定通配符和⾮限定通配符 ?这是另⼀个⾮常流⾏的Java泛型⾯试题。
限定通配符对类型进⾏了限制。
有两种限定通配符,⼀种是<? extends T>它通过确保类型必须是T 的⼦类来设定类型的上界,另⼀种是<? super T>它通过确保类型必须是T的⽗类来设定类型的下界。
泛型类型必须⽤限定内的类型来进⾏初始化,否则会导致编译错误。
另⼀⽅⾯<?>表⽰了⾮限定通配符,因为<?>可以⽤任意类型来替代。
更多信息请参阅我的⽂章泛型中限定通配符和⾮限定通配符之间的区别。
4. List<? extends T>和List <? super T>之间有什么区别 ?这和上⼀个⾯试题有联系,有时⾯试官会⽤这个问题来评估你对泛型的理解,⽽不是直接问你什么是限定通配符和⾮限定通配符。
java 容易发生bug的代码
![java 容易发生bug的代码](https://img.taocdn.com/s3/m/1f6195545e0e7cd184254b35eefdc8d376ee14e5.png)
java 容易发生bug的代码在Java中,有几个常见的错误和容易导致bug的代码模式。
下面将介绍其中的一些常见错误,以及如何避免它们。
1.空指针异常(NullPointerException):空指针异常是Java程序中最常见的bug之一。
它发生在尝试访问或操作空对象引用时。
这种错误通常是由于没有对引用进行null检查而导致的。
例如:```String str = null;int length = str.length(); //这里会抛出空指针异常,因为str是空引用```避免空指针异常的方法是始终在使用对象引用之前进行null检查,或者使用可空性注解(如@Nullable和@NonNull)。
此外,还可以在使用对象引用之前,确保对象已正确初始化。
2.数组越界异常(ArrayIndexOutOfBoundsException):数组越界异常是另一种常见的错误,它发生在尝试访问超出数组界限的元素时。
这种错误通常是由于使用不正确的索引或在循环中遍历数组时出错而导致的。
例如:```int[] nums = {1, 2, 3};int num = nums[3]; //这里会抛出数组越界异常,因为数组索引从0开始,而这里使用了索引3```要避免数组越界异常,需要确保在访问数组元素之前检查索引是否在有效范围内。
还可以使用增强的for循环(foreach循环)来遍历数组,以避免手动迭代索引。
3.类型转换异常(ClassCastException):类型转换异常是另一个常见的错误类型,它发生在尝试将一个对象转换为不兼容类型时。
这种错误通常是在进行强制类型转换时出现的。
例如:```Object obj = "Hello";Integer num = (Integer) obj; //这里会抛出类型转换异常,因为String不能直接转换为Integer```要避免类型转换异常,应该在进行强制类型转换之前,使用instanceof运算符检查对象类型。
解决SpringBoot使用devtools导致的类型转换异常问题
![解决SpringBoot使用devtools导致的类型转换异常问题](https://img.taocdn.com/s3/m/3f632a14cd1755270722192e453610661ed95afc.png)
解决SpringBoot使⽤devtools导致的类型转换异常问题问题:最近在使⽤新框架SpringBoot + shiro + spring-data-jpa时,为了体验下spring⾃带的热部署⼯具的便捷,于是引⼊了<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><!-- optional=true,依赖不会传递,该项⽬依赖devtools;之后依赖myboot项⽬的项⽬如果想要使⽤devtools,需要重新引⼊ --><optional>true</optional></dependency>在起初并没遇到什么问题,当使⽤shiro的session管理,⽽且⽤的sessionDao是redis实现的,然后再使⽤Session存取属性时,发现存进去的属性,再取出来后,就会出现类型转换异常ClassCastException分析:然后⾃⼰写了⼀⼤推单元测试模拟就是没问题,后来突然意识到会不会是因为ClassLoader不同导致的类型转换异常呢,然后注意了下项⽬启动时加载项⽬中的类使⽤的加载器都是org.springframework.boot.devtools.restart.classloader.RestartClassLoader⽽从shiro session 取出来的对象(从redis中取出经过反序列化)的类加载器都是uncher.AppClassLoader很明显会导致类型转换异常,原来Spring的dev-tools为了实现重新装载class⾃⼰实现了⼀个类加载器,来加载项⽬中会改变的类,⽅便重启时将新改动的内容更新进来,其实其中官⽅⽂档中是有做说明的:By default, any open project in your IDE will be loaded using the “restart” classloader, and any regular .jar file will be loaded using the “base” classloader. If you work on a multi-module project, and not each module is importedinto your IDE, you may need to customize things. To do this you can create a META-INF/spring-devtools.properties file. The spring-devtools.properties file can contain restart.exclude. and restart.include.prefixed properties. The include elements are items that should be pulled up into the “restart” classloader, and the exclude elements are items that should be pushed down into the “base” classloader. The value of the property isa regex pattern that will be applied to the classpath.解决:⽅案⼀、解决⽅案就是在resources⽬录下⾯创建META-INF⽂件夹,然后创建spring-devtools.properties⽂件,⽂件加上类似下⾯的配置:panycommonlibs=/mycorp-common-[\w-]+.jar restart.include.projectcommon=/mycorp-myproj-[\w-]+.jarAll property keys must be unique. As long as a property starts with restart.include. or restart.exclude. it will beconsidered. All META-INF/spring-devtools.properties from the classpath will be loaded. You can package filesinside your project, or in the libraries that the project consumes.⽅案⼆、不使⽤spring-boot-devtools针对⽅案⼀作⼀个详细的案例进⾏分析说明,以及解决问题⾸先准备⼀个jar包,⾥⾯包含序列化以及反序列化的功能。
java.lang.ClassCastException:java.lang.String。。。
![java.lang.ClassCastException:java.lang.String。。。](https://img.taocdn.com/s3/m/62c9b270cbaedd3383c4bb4cf7ec4afe04a1b133.png)
ng.ClassCastException:ng.String。
map⾥放了string的数字,转型integer会报错。
ng.ClassCastException: ng.String cannot be cast to ng.Integer梳理调查了⼀下,终于搞清楚了。
先来3个放进map⾥的变量Integer a = 111;String b = "bbbbb";String c = "881155";a是intege数字,c是数字的字符串Map paramszc;paramszc = new HashMap();paramszc.put("hostName", b);paramszc.put("testID", a);paramszc.put("exec", c);Integer zzz = (Integer) paramszc.get("testID");//error//Integer zzz1 = (Integer) paramszc.get("exec");Map<String, Object> paramsyyy = new HashMap<String, Object>();paramsyyy.put("hostName", b);paramsyyy.put("testID", a);paramsyyy.put("exec", c);Integer zczz = (Integer) paramsyyy.get("testID");Integer zzz1 = (Integer) paramsyyy.get("exec");意思是,不管你定义的map是不写类型直接new hashmap,还是写⼀个new HashMap<String, Object>();你put的时候是integer 那么可以直接强转不会报错Integer zzz = (Integer) paramszc.get("testID");但是如果你放进去的时候是字符串,内容是数字,你强转就要报标题的错误了Integer zzz1 = (Integer) paramszc.get("exec");会报错ng.ClassCastException: ng.String cannot be cast to ng.Integer为了不报错,可以这样写Integer.parseInt(params.get("testID").toString())。
如何避免在父类转换到子类时发生java.lang.ClassCastException
![如何避免在父类转换到子类时发生java.lang.ClassCastException](https://img.taocdn.com/s3/m/fa331d42f6ec4afe04a1b0717fd5360cbb1a8d57.png)
如何避免在⽗类转换到⼦类时发⽣ng.ClassCastException 在⽗类转换到⼦类时会发⽣ClassCastException异常,当你⾯对⼀个⼯程时成千上百的类时,是不太容易发现类之间的关系的,所以即使知道该原则,有时候还是避免不了,那应该如何处理呢:SuperClasspublic class SuperClass {private String name;public String getName() {return name;}public void setName(String name) { = name;}}SubClasspublic class SubClass extends SuperClass {private String performance;public String getPerformance() {return performance;}public void setPerformance(String performance) {this.performance = performance;}}测试public static void main(String[] args) {SuperClass superClass = new SuperClass();SubClass subClass = (SubClass) superClass;subClass.setName("abc");System.out.println(subClass.getName());}上述代码如约抛出了ClassCastException,怎么避免?在每次进⾏强制转换时使⽤instanceof判断⼀下是否存在关系,然后再进⾏转换。
if(superClass instanceof SubClass){subClass = (SubClass) superClass;subClass.setName("abc");System.out.println(subClass.getName());}即当每次想把⼀个对象转换为另⼀个类的实例的时候,先判断该对象是否是⽬标类的⼀个实例,这样就能避免这样的错误。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
问题描述ClassCastException 是JVM 在检测到两个类型间的转换不兼容时引发的运行时异常。
此类错误通常会终止用户请求。
本模式试图为您提供了解和排除ClassCastException 错误最常见成因的一些基本要素。
故障排除请注意,并非下面所有任务都需要完成。
有些问题仅通过执行几项任务就可以解决。
为什么发生此问题?在执行几乎任何子系统(Web 容器、EJB、JCA、群集等)的应用程序代码或WebLogic Server 代码内均可能发生 ClassCastException。
通过转换,可以指示 Java 编译器将给定类型的变量作为另一种变量来处理。
对基础类型和用户定义类型都可以进行转换。
Java 语言规范定义了允许的转换,其中的大多数可在编译时进行验证。
不过,某些转换还需要运行时验证。
如果在此运行时验证过程中检测到不兼容,JVM 就会引发 ClassCastException。
假设有一个 S 类型的对象,我们想把它转换为 T 类型。
如果存在以下情况,上述转换就可能引发 ClassCastExceptionS 与T 不兼容。
规范规定:“当应用程序代码尝试将某一对象转换为某一子类时,如果该对象并非该子类的实例,JVM 就会抛出ClassCastException。
”以下是一个示例代码,执行该代码时将会引发此类错误:∙S 类型和T 类型兼容,但加载时使用了不同的ClassLoader。
第二个原因实际上是这种错误最常见的原因。
这种情况在诊断上有相当的难度,而且需要对Java 类加载以及WebLogic 类加载体系结构方面的基础知识有一定程度的了解。
什么是ClassLoader?ClassLoader 是允许 JVM 查找和加载类的一种 Java 类。
JVM 有内置的ClassLoader。
不过,应用程序可以定义自定义 ClassLoader。
应用程序定义新的 ClassLoader 通常有两个主要目的:∙自定义和扩展JVM 加载类的方式。
例如:增加对新的类库(网络、加密文件等)的支持∙划分JVM 名称空间,避免名称冲突。
举例来说,利用划分技术可同时运行同一应用程序的多个版本(基于空间的划分)。
此项技术在应用程序服务器(如WebLogic Server)内的另一个重要用途是启用应用程序热重新部署,即在不重新启动JVM 的情况下启动应用程序的新版本(基于时间的划分)。
ClassLoader 按层级方式进行组织。
除系统 Boot ClassLoader 外,其它ClassLoader 都必须有父 ClassLoader。
/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 加载的。
要验证这一点,请像下面这样拆分该代码行:典型的输出可能与此类似:下一步是探查为什么涉及了不同的ClassLoader。
请执行下列检查清单中的各项检查:∙检查应用程序打包情况,并检查“Foo”是否是使用由不同ClassLoader 加载的不同模块打包而成。
在这方面众所周知的一个成因是Web 应用程序的“prefer-web-inf-classes”功能(请参阅已知的WebLogic 问题)∙检查它正在使用的应用程序代码或某个框架代码是否更改了WebLogic 线程的上下文ClassLoader,且在请求流程期间未将其还原。
如果应用程序代码内有对Thread.setContextClassloader(cl)的调用,就可能存在这种情况。
∙如果上述所有措施均无济于事,请尝试将问题隔离在一个简单的、可重现的测试案例中,然后联系BEA 技术支持部门,以做进一步探查。
已知的WebLogic Server 问题以下汇集了可导致ClassCastException 错误的各种情况,您在使用各种WebLogic 子系统时可能会遇到这些情况。
小程序有关该情况的完整说明,请参考/wls/docs81/applets/usingapplets.html (English)摘要:如果小程序中的WebLogic Server 客户端尝试从ClassLoader 获取某些资源信息,且一并使用了缓存标志和codebase=/bea_wls_internal/classes标志,就可能会抛出ClassCastException。
解决方法:∙在将类路径servlet 用作代码基时,请不要使用“cache_option”和“cache_archive”一类的缓存选项。
∙使用缓存选项时,请不要使用/classes (ClasspathServlet) 做为代码基。
如果要这样做,请先使用归档实用程序打包客户端JAR。
有关此限制的详细信息,请参阅/developer/bugParade/bugs/4648591.html (English)。
JCA Connector有关该情况的完整说明,请参考/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 动态重新加载有关该情况的完整说明,请参考/wls/docs81/jsp/reference.html (English)摘要:要在会话过程中动态重新加载 servlet 或 JSP,servlet 会话中存储的对象必须是可序列化的。
需要进行序列化是因为,servlet 是使用新的ClassLoader 重新加载的,而这会导致此前加载的所有类(旧版本 servlet 中的类)与使用新的 ClassLoader 加载的所有类(新版本 servlet 类)发生不兼容的情况。
这种不兼容会导致 servlet 返回ClassCastException 错误。
使用Prefer-web-inf-classes 功能有关该情况的完整说明,请参考/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。