2015-02-25 5 views
1

встроить скрипт движок JRuby в мою Java программу с помощью javax.script.ScriptEngineManagerNullPointerException при использовании JRuby

Я сделал некоторый JRuby код, который закончится с do ~ end блоком, после выполнения всего кода, NullPointerException произошло. , но код заканчивается любым другим утверждением, исключение не происходит.

версия: 1.7.19

Caused by: java.lang.NullPointerException 
    at org.jruby.embed.variable.Argv.updateARGV(Argv.java:169) 
    at org.jruby.embed.variable.Argv.retrieve(Argv.java:158) 
    at org.jruby.embed.variable.VariableInterceptor.retrieve(VariableInterceptor.java:154) 
    at org.jruby.embed.internal.BiVariableMap.retrieve(BiVariableMap.java:378) 
    at org.jruby.embed.internal.EmbedEvalUnitImpl.run(EmbedEvalUnitImpl.java:124) 

в ARGV.java updateARGV

if (vars.containsKey((Object)name)) { 
    var = vars.getVariable((RubyObject)receiver.getRuntime().getTopSelf(), name); 
     var.setRubyObject(argv); 

vars.getVariable возвращается нуль из-за isReceiverIdentical возвращения ложной в BiVariableMap.java

if (var.isReceiverIdentical(receiver)) { 
    return var; 
} 

В isReceiverIdentical этот метод просто сравнивает приемник с приемником BiVariable usgin '=='.

Является ли эта ошибка jruby? Или мне нужно что-то сделать для этого? Если вам нужна дополнительная информация по этой проблеме, plz прокомментировать это!


Я получил ScriptEngine (двигатель) от ScriptEngineManager и установить некоторый экземпляр Java и метод, как этого

engine.put("this", console); 
engine.eval("$command = $this.java_method :command, [java.lang.String]"); 

вот мой тест рубин код. result и tab - объект java , который имеет некоторый метод, возвращает строку и список.

result = $command.call "something to pass" 
puts result.getMessage 
tabular = result.getData 

tabular.each do |tab| 
    rows = tab.getRows 
    rows.each do |row| 
    puts row 
    end 
    puts tab.getColumnNames 
end 
+0

Я видел аналогичные вопросы NPE с JRuby в 'BiVariableMap' ... сделал [PR] (https://github.com/jruby/jruby/pull/2456), чтобы зафиксировать его , Я на 95% уверен, что ваше дело также охвачено ... если вы можете создать свой собственный * jruby.jar * и убедитесь, что это было бы полезно (прокомментируйте PR с подробной информацией или обратитесь к нему из проблемы, если вы около, чтобы открыть новый) – kares

+0

@kares благодарю вас за комментарий. Но ... когда я построил jruby.jar с вашими изменениями в ветке встроенной очистки, он все равно бросает NPE. В любом случае, я проверю его больше. – parivana

+0

в этом случае обязательно отобразите код (один сниппет) для воспроизведения ... – kares

ответ

0

Я создал рубиновый объект типа в моем коде Java, создавая новый объект Ruby ...

Это вызывает проверку неудачи в updateARGV потому приемник, который зарегистрировать переменный в BiVariableMap и другой приемник, который переменные обновления является другой.

Итак, у меня есть объект Ruby из нового ScriptingContainer (из него мы всегда можем получить один и тот же объект Ruby, если локальный контекст является singleton) и использовали его для создания нового объекта типа ruby ​​в моем java-коде.

Ссылка: https://github.com/jruby/jruby/wiki/RedBridge#Singleton

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