2013-03-21 2 views
2

Я пытаюсь вызвать функцию ruby ​​в java. но при запуске программы я получил NullPointerException.
Вот мой код Javajava.lang.NullPointerException при использовании Java с Ruby

import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.Reader; 
import javax.script.Invocable; 
import javax.script.ScriptEngine; 
import javax.script.ScriptEngineManager; 
import javax.script.ScriptException; 
import java.io.InputStream; 

public class MyProgram 
{ 

public static void main(String[] args) throws IOException, NoSuchMethodException 
    { 
     try 
     { 
      ScriptEngineManager mgr = new ScriptEngineManager(); 
      ScriptEngine rbEngine = mgr.getEngineByExtension("rb"); 

      InputStream is = ClassLoader.getSystemResourceAsStream("src/myruby.rb"); 
      Reader reader = new InputStreamReader(is); 
      rbEngine.eval(reader); 
      Invocable invocableEngine = (Invocable)rbEngine; 

      if (invocableEngine != null) 
      { 
       int set = (Integer) invocableEngine.invokeFunction("myfunc",6,6); 
      } 

     } 
     catch (ScriptException e) 
     { 
      System.out.println("\nScriptException = "+e); 
     } 
    } 
} 

И файл myruby.rb содержит

def myfunc(a,b) 
    f=a+b 
    return f 
end 

ошибка я получаю,

Exception in thread "main" java.lang.NullPointerException 
    at java.io.Reader.<init>(Unknown Source) 
    at java.io.InputStreamReader.<init>(Unknown Source) 
    at MyProgram.main(MyProgram.java:22) 

Пожалуйста, помогите мне найти проблему.
Спасибо заранее.

+0

в catch, пожалуйста, используйте 'e.printStackTrace()' и после этого обменивайтесь исключением. Я полагаю, ваш объект 'ScriptEngineManager mgr' имеет значение null, и он выбрасывает исключение в' mgr.getEngineByExtension («rb»); ' – Freak

ответ

1
InputStream is = ClassLoader.getSystemResourceAsStream("src/myruby.rb"); 

Здесь is является null.

Попробуйте абсолютный путь, чтобы открыть файл.

Если ваш файл обнаружен, возникнут проблемы с ClassLoader.getSystemResourceAsStream.

+0

absolute дорожка? Вы имеете в виду полный путь к этому файлу? –

+0

Да, вы используете относительный путь. – LaGrandMere

0

As LaGrandMere сказал в своем ответе is здесь null.

Это null, так как ClassLoader.getSystemResourceAsStream не может найти указанный ресурс.
ClassLoader ищет ресурс в указанном classpath.
Чтобы получить этот ресурс, добавьте myruby.rb в свой путь к классу.

Надеюсь, что это поможет!

Смежные вопросы