使用 BIMserver Java 客户端检索 class 的所有实例时出现空指针异常

Null pointer exception while retrieving all instances of a class with the BIMserver Java client

我是 BIMserver 的新手,我正在尝试使用 Java 客户端库和 IfcModelInterface 获取我签入的特定 class IFC 的实例。

这是一段代码:

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

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

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

eClass 为空,因此出现异常,我不明白为什么?

查看您的堆栈跟踪,我假设这一行是 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));
}

然后我们在 (ClientIfcModel.java:582)

中调用 eClass.getName() 时来到 NullPointer
public <T extends IdEObject> List<T> getAllWithSubTypes(EClass eClass) {
    if (!loadedClasses.contains(eClass.getName()) && modelState != ModelState.FULLY_LOADED) {
    ...
}

您传入一个普通的 Java Class interfaceClass,它被映射到一个 EMF EClass 以检索它的所有实例。这个映射是在packageMetaData.getEClass(interfaceClass)中进行的。仅当您传入的 Class interfaceClass 属于与模型的 packageMetaData.

相同的 IFC 架构版本时,它才有效

例如,假设您请求的接口类是 org.bimserver.models.ifc4.IfcProduct 而您的 model.getPackageMetaData().getSchema()Schema.IFC2X3TC1,那么映射将是 return 和 EClass null 而您随后将看到 NullPointer。

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