我对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和非法状态异常......
答案 0 :(得分:2)
为什么你期望这里有ClassCastException?
st
是provider
,您明确地创建了一个,因此将provider
对象分配给provider
类型的引用是可以的。
唯一的问题是编译器不知道' st
将在运行时指向provider
对象。由于st
的静态类型为consumer
,因此在第二行中需要显式转换为provider
。但这并不特别......
答案 1 :(得分:1)
在这里,您指向提供者对象(RHS)并告诉 - “这是一个消费者”(参考),这是正确的,因为提供者扩展了消费者。
provider est=(provider)st;
在这里,您指向提供者对象(RHS)并告诉“这是一个提供者”(参考)。这也是正确的。所以,你应该/不会得到任何错误。
答案 2 :(得分:0)
当您尝试将对象强制转换为此层次结构中无法访问的类型时,JVM会抛出ClassCastException
。
根据您的代码,没有理由这样的例外,这就是为什么:
1)你有两个类:consumer
和provider
,后者扩展了前者:
public class provider extends consumer
2)您的代码正在实例化provider
类并将其分配给consumer
变量:
consumer st=new provider();
此处没有任何理由可以解释任何类型的异常,因为provider
扩展consumer
,provider
类的所有实例也都是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);
}
}