这是一个Scala模块:
package xpf
import java.io.File
import org.jdom.Element
import org.jdom.input.SAXBuilder
object xmlpf {
def load_file(filename: String): Element = {
val builder = new SAXBuilder
builder.build(new File(filename)).getRootElement
}
}
下面是Java代码,调用Scala中的方法:
package textxpf;
import org.jdom.Element;
public class Main {
public static void main(String[] args) {
Element root = xpf.xmlpf.load_file("/home/capkidd/proj/XmlPathFinder/Staff.xml");
System.out.println(root.getName());
}
}
运行java主程序,我看到
run:
Exception in thread "main" java.lang.NullPointerException
at textxpf.Main.main(Main.java:8)
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)
探索问题,我发现我不能从任何Scala方法返回任何类型的值给调用它的Java代码。
我使用NetBeans 6.9.1和Scala 2.8.1插件。Scala-library.jar和jdom.jar已正确插入到项目中。
我做错了什么?有人知道吗?
试试这个,然后相应地调试:
package xpf
import java.io.File
import org.jdom.Element
import org.jdom.input.SAXBuilder
object xmlpf {
def load_file(filename: String): Element = {
val builder = new SAXBuilder
val re = builder.build(new File(filename)).getRootElement
if (re == null) throw new NullPointerException("the root element is null!")
re
}
}
我尝试了一个类似的程序,没有问题:
// ms/MyObject.scala
package ms
object myObject {
def foo(s: String) = s
}
// mj/MyObject2.java
package mj;
public class MyObject2 {
public static void main(String[] args) {
System.out.println(ms.myObject.foo("hello"));
}
}
我编译了这两个文件,然后"scala -cp"。mj.MyObject2"。可以在scala 2.8.1.final中正常工作。这个示例在您的设置中工作吗?
所以,我想知道这是否是某种环境问题,比如拿起一个陈旧的Scala类构建?您是否尝试过从头构建干净的版本?您的运行时类路径正确吗?