0

我对 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;
        }
     }

我被这部分困住了。据我说,它应该产生一个异常(类转换或非法状态)。但是在执行中没有异常,可能有classcastexception或者inlegalstateexception。但是代码执行没有任何异常,原因???

我在异常处理方面花了一周时间,努力掌握异常处理。任何人都可以解释为什么它不会在行中显示错误

    consumer st=new provider();     
    provider est=(provider)st;

还要解释类广播和非法状态异常......

4

5 回答 5

2

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

唯一的问题是编译器不“知道”在运行时st将指向一个provider对象。因为stis的静态类型,所以在第二行中需要consumer显式转换为。provider但这没什么特别的...

于 2013-09-25T11:00:30.523 回答
1

消费者 st=新提供者();

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

  provider est=(provider)st;

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

于 2013-09-25T11:07:09.787 回答
0

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

根据您的代码,没有理由出现这种异常,原因如下:

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

public class provider extends consumer

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

consumer st=new provider();

这里没有任何异常的理由,因为providerextends ,一个类的consumer所有实例也是 a ,所以你可以使用类型来引用任何类型的。providerconsumerconsumerprovider

3)您正在将provider实例转换为...(鼓声)provider实例!:

provider est=(provider)st;

变量stconsumer类型为true;但是你像provider以前一样初始化它(记住new provider()语句)。所以,在内部它provider不是一个consumer所以当做那个演员没有任何错误发生的时候。

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

于 2013-09-25T11:05:01.870 回答
0

ClassCastException当转换类型不兼容的对象时抛出A。例如

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

上面的代码将抛出一个 classCastException,因为消费者类型的对象永远不能是提供者对象。

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

当您向下转换将对象从父类转换为子类时,如果要转换的对象是父类类型并且引用是子类类型,则可能会引发 ClassCastException。

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

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

于 2013-09-25T11:05:10.193 回答
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);
}
}
于 2013-09-25T11:11:14.417 回答