将方法内部生成的 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 m
在 method1
:
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"?
首先我在 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 m
在 method1
:
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"?