这个java代码是否有可能出现ClassCastException/IllegalStateException?

这个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[]) {

我对classcastexception和illegalstateexception都有点困惑,因为在大多数情况下,它们似乎都很相似

在这里,我遇到了这个java代码中的一个问题

 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