首先,我在method1
内生成了一个本体。它很成功。然后在第二种方法中,我需要将这个生成的本体用于另一个进程。我使用以下代码。它给出了一个错误:
线程中的异常" main"显示java.lang.NullPointerException。
问题出在哪里?我需要如何在method1
到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;
}
答案 0 :(得分:2)
如果您对OntModel
实例多次使用OntologyCreation
,则可以使用字段存储变量:
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"?
答案 1 :(得分:1)
您无法通过指定函数内部参数的名称来更改函数外部的变量。这样做的唯一方法是更改有问题的局部变量。因此,m
中method1
的分配正确设置了局部变量m
,但这不会影响m
中的变量method2
。
解决方案是让method1
返回对象,然后将其分配给局部变量:m = method1()
答案 2 :(得分:0)
在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
。
答案 3 :(得分:0)
在m
被调用之前,您method2
变量未被实例化。
因此它的值为null
。
即使您正在调用method1
,该归因也只对该方法的范围有效。
您应该在OntModel m = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
之前ont.method2(ontoClass, m);
m
才能在method2
上使用Android CTS 5.1_r5
Non-interactive mode: Running initial command then exiting.
Using commandline arguments as starting command: [run, cts, --plan, CTS, -s, JS2U300154120087, --disable-reboot]
02-27 17:49:09 I/DeviceManager: Detected new device JS2C300154455332
02-27 17:49:09 I/DeviceManager: Detected new device JS2U300154120087
02-27 17:49:09 I/TestInvocation: Starting invocation for 'cts' on build '5.1_r5' on device JS2U300154120087
02-27 17:49:09 I/JS2U300154120087: Created result dir 2016.02.27_17.49.09
02-27 17:49:10 I/CtsTest: ABIs: [armeabi-v7a, arm64-v8a]
。