【问题标题】:Can't get round a ClassCastException无法绕过 ClassCastException
【发布时间】:2012-07-17 15:42:20
【问题描述】:

尝试在我的门户应用程序中转换 context.lookup() 调用的结果时,我在三分之二的尝试转换不同结果时得到了 ClassCastException

经过一些研究,我认为:http://wiki.sdn.sap.com/wiki/display/TechTSG/%28AS+Java%29+ClassCastException+Occurs+After+Lookup+Operation 有答案,但并没有真正解释如何执行这两个步骤。

此代码用于从存储在list 中的路径中获取 iView 的详细信息:

IiView transView1 = (IiView) context.lookup(list.get(i).toString());

但是当像这样获取工作集的详细信息时:

IPcdContext attrSet = (IPcdContext) context.lookup(list.get(i).toString());

我收到了ClassCastException。任何有关我为什么会收到此错误的帮助或解释将不胜感激!

编辑:这是代码的基础:http://www.sdn.sap.com/irj/scn/go/portal/prtroot/docs/library/uuid/6112ecb7-0a01-0010-ef90-941c70c9e401?overridelayout=true

edit2:我从 context.lookup 中返回的对象是 com.sapportals.portal.pcd.pcm.roles.PortalWorkset,我找不到关于它的文档。

【问题讨论】:

  • 确切的异常文本是什么?
  • 可能你得到了例外,因为无论你从context.lookup 得到什么,都不是IPcdContext。您应该将其捕获为 Object 并执行 .getClass().getName() 以了解您得到了什么。

标签: java sap enterprise-portal


【解决方案1】:

如果context.lookup 返回PortalWorkset,则无法“绕过”ClassCastException。

强制转换不会将对象转换到不同的类——它只是告诉编译器你确定它是一个比它当前声明的类型更具体的类的一种方式。在这种情况下,你说“我意识到 lookup() 方法被声明为返回 Object,但是当我在这个特定的上下文中调用它时,我确信它总是会专门返回一个 IPcdContext 对象。 "您在这里的假设结果不成立,程序通过抛出异常正确地发出信号。

您的问题可能有两个原因:

  1. 您的假设总体上是正确的,但是由于逻辑错误,您没有将您期望的字符串传递给lookup 方法,因此完全得到了错误的东西。在这种情况下,请确保传递给方法的参数始终正确。
  2. 您的假设不正确,您可能不会总是得到IPcdContext 回复。在这种情况下,您需要决定如何处理返回的其他对象,并适当地处理它们(您可以使用instanceof 运算符来检查返回对象的类)。

在任何情况下,每当您进行强制转换时,首先检查它是否会成功通常是有益的,使用成语如下:

IPcdContext context;
Object obj = context.lookup("foo");
if (obj instanceof IPcdContext) {
    context = (IPcdContext)obj;
}
else {
    // You got back something else.  What to do?
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-15
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    • 2016-01-01
    • 1970-01-01
    相关资源
    最近更新 更多