这个java代码有没有机会出现ClassCastException / IllegalStateException?

时间:2013-09-25 10:55:00

标签: java exception-handling casting classcastexception illegalstateexception

我对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和非法状态异常......

5 个答案:

答案 0 :(得分:2)

为什么你期望这里有ClassCastException? stprovider,您明确地创建了一个,因此将provider对象分配给provider类型的引用是可以的。

唯一的问题是编译器不知道' st将在运行时指向provider对象。由于st的静态类型为consumer,因此在第二行中需要显式转换为provider。但这并不特别......

答案 1 :(得分:1)

消费者st = new provider();

在这里,您指向提供者对象(RHS)并告诉 - “这是一个消费者”(参考),这是正确的,因为提供者扩展了消费者。

  provider est=(provider)st;

在这里,您指向提供者对象(RHS)并告诉“这是一个提供者”(参考)。这也是正确的。所以,你应该/不会得到任何错误。

答案 2 :(得分:0)

当您尝试将对象强制转换为此层次结构中无法访问的类型时,JVM会抛出ClassCastException

根据您的代码,没有理由这样的例外,这就是为什么:

1)你有两个类:consumerprovider,后者扩展了前者:

public class provider extends consumer

2)您的代码正在实例化provider类并将其分配给consumer变量:

consumer st=new provider();

此处没有任何理由可以解释任何类型的异常,因为provider扩展consumerprovider类的所有实例也都是consumer,因此您可以使用consumer类型可引用任何类型的provider

3)您正在将provider实例投射到...(鼓声)provider实例中!:

provider est=(provider)st;

变量st属于consumer类型,为true;但是你之前将它初始化为provider(记住new provider()语句)。所以,在内部它是一个provider而不是consumer所以当制作那个演员时没有任何错误发生。

IllegalStateExceptions以不同的方式工作,由于多种原因,JVM中的某些类可能会抛出它。即使您的代码也可以满足您的特定需求。它抛出的原因取决于每个类的实现。

答案 3 :(得分:0)

当投射不兼容类型的对象时,抛出ClassCastException。例如

consumer c = new consumer();
provider p = (provider) c;

上面的代码将抛出一个classCastException作为类型为consumer的对象永远不能成为提供者对象。

在您的代码中,您正在创建provider类型的对象,并将其分配给类型为consumer的引用。这是完全合法的,因为consumer对象中的所有方法都在provider对象中。所以不会抛出任何异常。它被称为 Upcast

如果您正在将一个对象从父类转换为子类,那么当正在转换的对象属于父类类型且引用属于子类类型时,可能会抛出ClassCastException。

provider p = (provider) c; // will give you a ClassCastException

因为类Child中的方法不会出现在父类中,如果在父类型对象上调用子特定方法,则会导致运行时崩溃。

答案 4 :(得分:0)

程序没什么问题..所以它会毫无例外地运行... 但是如果你在没有感知的情况下尝试那么它会在编译时给出错误... 尝试使用此程序进行类强制转换

class consumer
{
int a=0;
void method(Object ob)
{
    consumer st=(consumer)ob;
}

}
public class provider
{
public static void main(String args[])
{
    consumer st=new consumer();     
    provider est=new provider();
    st.method(est);
}
}