Исключение нулевого указателя при получении всех экземпляров класса с помощью Java-клиента BIMserver - PullRequest
0 голосов
/ 09 сентября 2018

Я очень плохо знаком с BIMserver и пытаюсь получить экземпляры определенного класса IFC, который я зарегистрировал, используя клиентскую библиотеку Java и IfcModelInterface.

Вот код:

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 имеет значение null, и поэтому я получаю исключение, я не понимаю, почему?

1 Ответ

0 голосов
/ 22 октября 2018

Глядя на вашу трассировку стека, я предполагаю, что эта строка - 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, вам нужно будет выполнить проверку схемы модели во время выполнения и запросить экземпляры только в том случае, если схема соответствует ожидаемой.

...