Java

时间:2016-06-01 07:07:32

标签: java classcastexception

我想从会话对象中读取一个返回Object类型的值。 我知道该对象具有true / false值。 我想将该值转换为boolean类型。所以我有以下代码。

session.getAttribute("MyKeyValue"); // It returns Object type

下面抛出异常。

boolean myBoolVal = Boolean.parseBoolean((String) session.getAttribute("MyKeyValue"));

以下工作正常。

boolean myBoolVal = Boolean.parseBoolean(session.getAttribute("MyKeyValue").toString());

实际上,我不明白为什么选项1不起作用?

2 个答案:

答案 0 :(得分:8)

session.getAttribute("MyKeyValue")返回的实例的运行时类型不是String时,将其转换为String会抛出ClassCastException

另一方面,session.getAttribute("MyKeyValue").toString()始终有效(假设session.getAttribute("MyKeyValue")不为空),因为所有对象都具有toString()方法的实现。

BTW,由于session.getAttribute("MyKeyValue")没有返回String,因此可能会返回Boolean(因为您希望Boolean.parseBoolean()能够正常工作),所以如果是这种情况,您可以将其转换为String,而不是将其转换为Boolean然后转换为Boolean

Boolean myBoolVal = (Boolean) session.getAttribute("MyKeyValue");

答案 1 :(得分:0)

您可以在会话对象中设置所需的任何对象,并将其与关联关联。任何对象都意味着任何类的任何对象。由于任何类都可能是Object的间接子类,因此Objectset中的类型为get

当您通过get检索对象时,它只是输入为Object,但肯定属于某个子类。 (向下)将其转换为String可能会失败(如果原始类不是String,则会抛出异常,表示无法实现强制转换/转换)。似乎是你的选择1的情况。

选项2有效,因为任何Object实例都有一个方法toString(),可以调用该方法来获取对象的String表示(主要用于屏幕上的表示)。然后,您parse该表示(可能是"true""false")获取booleantruefalse

因此,如果您希望选项1正常工作,因为您的对象可能是Boolean实例,您可以使用:

boolean myBoolVal = (Boolean)session.getAttribute("MyKeyValue");