Глядя на вашу трассировку стека, я предполагаю, что эта строка - 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) {
...
}
Вы передаете обычный Java Class interfaceClass
, который преобразуется в EMF EClass
для извлечения всех его экземпляров. Это отображение осуществляется в packageMetaData.getEClass(interfaceClass)
. Он работает только в том случае, если Class interfaceClass
, который вы передаете, относится к той же версии схемы IFC, что и модель packageMetaData
.
.
Например, допустим, что ваш запрашиваемый interfaceClass равен org.bimserver.models.ifc4.IfcProduct
, а model.getPackageMetaData().getSchema()
равен Schema.IFC2X3TC1
, тогда отображение вернет EClass null
, и вы впоследствии увидите NullPointer.
Чтобы предотвратить исключение NullPointer, вам нужно будет выполнить проверку схемы модели во время выполнения и запросить экземпляры только в том случае, если схема соответствует ожидаемой.