首页 > 解决方案 > 使用 BIMserver Java 客户端检索类的所有实例时出现空指针异常

问题描述

我对 BIMserver 非常陌生,我正在尝试使用 Java 客户端库和 IfcModelInterface 获取我签入的 IFC 的特定类的实例。

这是一段代码:

IfcModelInterface model = client.getModel(project, project.getLastRevisionId(),false, true,true);
Collection<IfcProduct> products = model.getAllWithSubTypes(IfcProduct.class);

调用getAllWithSubtypes导致空指针异常。当我调试时,它会转到以下类:

public <T extends IdEObject> List<T> getAllWithSubTypes(EClass eClass) {
    if (!loadedClasses.contains(eClass.getName()) && modelState != ModelState.FULLY_LOADED) {

eClass 为空,因此我得到一个异常,我不明白为什么?

标签: javanullpointerexceptionbim

解决方案


查看您的堆栈跟踪,我假设这一行是 Connecting.java:48

Collection<IfcProduct> products = model.getAllWithSubTypes(IfcProduct.class);

这将调用以下方法 ( IfcModel.java:310 )

public <T extends IdEObject> List<T> getAllWithSubTypes(Class<T> interfaceClass)  {
    return getAllWithSubTypes(packageMetaData.getEClass(interfaceClass));
}

然后我们在调用时来到 NullPointer eClass.getName()( ClientIfcModel.java:582 )

public <T extends IdEObject> List<T> getAllWithSubTypes(EClass eClass) {
    if (!loadedClasses.contains(eClass.getName()) && modelState != ModelState.FULLY_LOADED) {
    ...
}

Class interfaceClass您传入一个映射到 EMF的普通 Java ,EClass以便检索其所有实例。此映射在packageMetaData.getEClass(interfaceClass). 仅当Class interfaceClass您传入的 与模型的packageMetaData.

例如,假设您请求的 interfaceClass isorg.bimserver.models.ifc4.IfcProduct和您的model.getPackageMetaData().getSchema()is Schema.IFC2X3TC1,那么映射将返回 anEClass null并且您随后将看到 NullPointer。

为了防止 NullPointer 异常,您必须对模型的架构进行运行时检查,并且仅在架构符合您的预期时才请求实例。


推荐阅读