将方法内部生成的 ontology 用于 java 中的另一个方法

Use generated ontology inside a method to another method in java

首先我在 method1 中生成了一个 ontology。它是成功的。然后在第二种方法中,我需要将这个生成的 ontology 用于另一个进程。我使用了以下代码。它给出了一个错误:

Exception in thread "main" java.lang.NullPointerException.

问题出在哪里?我需要如何将 method1 中生成的 ontology 转换为 method2?

     public class OntologyCreation {

        public static void main (String args[]) {

        //main
        OntologyCreation ont = new OntologyCreation(); 
        OntModel m = null;
        String ontoClass = null;
        ont.method2(ontoClass, m);


        public  void method1(OntModel m) {     //for ontologyCreation
        m = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
        -----
        -----
        }


        public ArrayList<String> method2(String ontoClass, OntModel m) {   // 2nd method for use generated ontology to another process
        method1(m);
        m.read("http://localhost/myont/ont.owl");      ????????
        ExtendedIterator<OntClass> classes = ((OntModel) m).listClasses(); 
        ----------
        ----------               
         }
        return xx; 
        }

您不能通过赋值给函数内的参数名称来更改函数外的变量。唯一要做的就是更改有问题的局部变量。因此,对 method1 中的 m 的赋值会正确设置局部变量 m,但这不会影响 method2 中的变量 m

解决方法是将method1设为return对象,然后赋值给局部变量:m = method1()

Return mmethod1:

public OntModel method1(OntModel m) {     //for ontologyCreation
    m = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
    /*-----*/
    return m;
}

而在method2中,调用应该是:

m = method1(m);

Java 按值传递引用,意味着 method1 接收对象 m 的地址。但是,m = something 意味着您更改了 method1 中的地址值。在外面,它仍然是一样的,仍然指向一个 null.

m 变量在 method2 被调用之前没有被实例化。

因此它具有关联的值 null

即使您正在调用 method1,该属性也仅在该方法的范围内有效。

您应该在 ont.method2(ontoClass, m); 之前执行 OntModel m = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); 以便能够在 method2 上使用 m

如果您对 OntologyCreation 实例多次使用 OntModel,您可以使用一个字段来存储变量:

private OntModel m;

public void method1() {
    this.m = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
}

public ArrayList<String> method2(String ontoClass) {
    method1();
    this.m.read("http://localhost/myont/ont.owl"); // use field value

备选方案是返回创建的 OntModel,如其他答案中所述。

注意:Java总是传值,这就是为什么method2方法中的值仍然是null,见 Is Java "pass-by-reference" or "pass-by-value"?