这个java代码是否有可能出现ClassCastException/IllegalStateException?
我对classcastexception和illegalstateexception都有点困惑,因为在大多数情况下,它们似乎都很相似 在这里,我遇到了这个java代码中的一个问题这个java代码是否有可能出现ClassCastException/IllegalStateException?,java,exception-handling,casting,classcastexception,illegalstateexception,Java,Exception Handling,Casting,Classcastexception,Illegalstateexception,我对classcastexception和illegalstateexception都有点困惑,因为在大多数情况下,它们似乎都很相似 在这里,我遇到了这个java代码中的一个问题 class consumer { LOC---- } public class provider extends consumer { public static void main(String args[]) {
class consumer
{
LOC----
}
public class provider extends consumer
{
public static void main(String args[])
{
consumer st=new provider();
provider est=(provider)st;
}
}
我被这部分卡住了。据我所知,它应该生成一个异常(classcast或illegalstate)。但在执行过程中没有异常,可能存在classcastexception或illegalstateexception。但是代码执行时没有任何异常,原因是
我在异常处理方面花了一周时间,努力掌握异常处理。有人能解释为什么它没有在行中显示错误吗
consumer st=new provider();
provider est=(provider)st;
还要解释classcast和非法状态异常…为什么在这里会出现ClassCastException?
st
是一个提供程序
,您明确创建了一个,因此将提供程序
对象指定给提供程序
类型的引用是可以的
唯一的问题是编译器不“知道”运行时
st
将指向提供程序
对象。由于st
的静态类型是consumer
,因此第二行需要显式转换为provider
。但这没什么特别的…为什么你希望这里出现ClassCastException?
st
是一个提供程序
,您明确创建了一个,因此将提供程序
对象指定给提供程序
类型的引用是可以的
唯一的问题是编译器不“知道”运行时
st
将指向提供程序
对象。由于st
的静态类型是consumer
,因此第二行需要显式转换为provider
。但这没什么特别的…当您试图将对象强制转换为在该层次结构中无法访问的类型时,JVM会抛出ClassCastException
根据您的代码,不存在此类异常的原因,原因如下:
1) 您有两个类:消费者
和提供者
,后者扩展了前者:
public class provider extends consumer
2) 您的代码正在实例化提供者
类并将其分配给使用者
变量:
consumer st=new provider();
这里没有任何类型的异常的原因,因为提供者
扩展了使用者
,提供者
类的所有实例也是使用者
,所以您可以使用使用者
类型引用任何类型的提供者
3) 您正在将提供程序
实例强制转换为。。。(鼓轮)提供程序
实例!:
provider est=(provider)st;
变量st
属于consumer
类型,true;但是您在前面将其初始化为provider
(请记住newprovider()
语句)。因此,在内部,它是一个提供者
而不是消费者
,因此,当进行该转换时,不会发生任何错误
IllegalStateExceptions
以不同的方式工作,JVM中的一些类可能会抛出异常,原因有很多。甚至你的代码也可以根据你的特殊需要来使用它。抛出它的原因取决于每个类的实现。当您试图将对象强制转换为在该层次结构中无法访问的类型时,JVM会抛出ClassCastException
根据您的代码,不存在此类异常的原因,原因如下:
1) 您有两个类:消费者
和提供者
,后者扩展了前者:
public class provider extends consumer
2) 您的代码正在实例化提供者
类并将其分配给使用者
变量:
consumer st=new provider();
这里没有任何类型的异常的原因,因为提供者
扩展了使用者
,提供者
类的所有实例也是使用者
,所以您可以使用使用者
类型引用任何类型的提供者
3) 您正在将提供程序
实例强制转换为。。。(鼓轮)提供程序
实例!:
provider est=(provider)st;
变量st
属于consumer
类型,true;但是您在前面将其初始化为provider
(请记住newprovider()
语句)。因此,在内部,它是一个提供者
而不是消费者
,因此,当进行该转换时,不会发生任何错误
IllegalStateExceptions
以不同的方式工作,JVM中的一些类可能会抛出异常,原因有很多。甚至你的代码也可以根据你的特殊需要来使用它。抛出它的原因取决于每个类的实现。当抛出不兼容类型的对象时,会抛出ClassCastException
。比如说
consumer c = new consumer();
provider p = (provider) c;
上面的代码将抛出classCastException,因为consumer永远不能是Provider对象类型的对象
在代码中,您正在创建一个提供者
类型的对象,并将其分配给消费者
类型的引用。这是完全合法的,因为使用者
对象中的所有方法都将位于提供者
对象中。所以不会抛出任何异常。它被称为向上投射
当您向下转换从父类转换到子类的对象时,如果正在转换的对象是父类类型且引用是子类类型,则可能会引发ClassCastException
provider p = (provider) c; // will give you a ClassCastException
因为类
Child
中的方法不会出现在父类中,如果在父类型对象上调用子类特定的方法,则会在运行时导致崩溃。当铸造不兼容类型的对象时,会抛出ClassCastException
。比如说
consumer c = new consumer();
provider p = (provider) c;
上面的代码将抛出classCastException,因为consumer永远不能是Provider对象类型的对象
在代码中,您正在创建类型为provider