我对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为null,因此出现异常,我不明白为什么?
答案 0 :(得分:0)
查看您的堆栈跟踪,我假设这行是Connecting.java:48
psql -h <dbhost> -U <username> -W -d <dbname> < filename.sql
这将调用以下方法(IfcModel.java:310)
Collection<IfcProduct> products = model.getAllWithSubTypes(IfcProduct.class);
然后,当{ClientIfcModel.java:582)中调用public <T extends IdEObject> List<T> getAllWithSubTypes(Class<T> interfaceClass) {
return getAllWithSubTypes(packageMetaData.getEClass(interfaceClass));
}
时,我们进入NullPointer
eClass.getName()
您传入一个普通的Java public <T extends IdEObject> List<T> getAllWithSubTypes(EClass eClass) {
if (!loadedClasses.contains(eClass.getName()) && modelState != ModelState.FULLY_LOADED) {
...
}
,它被映射到EMF Class interfaceClass
中以检索其所有实例。此映射在EClass
中进行。仅当您传递的packageMetaData.getEClass(interfaceClass)
与模型的Class interfaceClass
属于相同的IFC架构版本时才有效。
例如,假设您请求的interfaceClass为packageMetaData
,而您的org.bimserver.models.ifc4.IfcProduct
为model.getPackageMetaData().getSchema()
,则映射将返回Schema.IFC2X3TC1
,随后您将看到NullPointer。
为防止NullPointer异常,您将必须对模型的架构进行运行时检查,并且仅在架构符合您的期望时才请求实例。