我的Scala方法不会将值返回给Java代码

时间:2011-04-09 09:41:04

标签: java scala netbeans interop

这是一个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已正确插入项目。

我做错了什么? 有人有什么想法吗?

2 个答案:

答案 0 :(得分:2)

尝试此操作然后进行相应的调试:

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
  }
}

答案 1 :(得分:1)

我尝试了一个没有问题的类似程序:

// 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类的陈旧构建?你从头开始尝试过干净的构建吗?您的运行时类路径是否正确?