2015-11-16 46 views
2

我嘗試通過JRuby使用Java Weka機器學習庫。它工作正常,到目前爲止,只有一兩件事我想知道:JRuby等效於將null轉換爲類

爲了創建一個字符串屬性,您可以使用相同的構造器爲在Java中名義屬性,但第二個參數被澆鑄FastVector空:

Attribute attribute = new Attribute("name", (FastVector) null); 

另見this Stackoverflow postweka doc for Attribute

在JRuby中,如果試圖通過剛剛nil,例如:

java_import 'weka.core.Attribute' 
attribute = Attribute.new('name', nil) 

這將引發Java::JavaLang::NullPointerException錯誤。

完整的堆棧跟蹤是:

Java::JavaLang::NullPointerException: 
from weka.core.Attribute.<init>(weka/core/Attribute.java:303) 
from weka.core.Attribute.<init>(weka/core/Attribute.java:290) 
from java.lang.reflect.Constructor.newInstance(java/lang/reflect/Constructor.java:423) 
from RUBY.<eval>((irb):7) 
from org.jruby.RubyKernel.eval(org/jruby/RubyKernel.java:978) 
from org.jruby.RubyKernel.loop(org/jruby/RubyKernel.java:1291) 
from org.jruby.RubyKernel.catch(org/jruby/RubyKernel.java:1098) 
from org.jruby.RubyKernel.catch(org/jruby/RubyKernel.java:1098) 
from Users.pgoetze.$_dot_rvm.rubies.jruby_minus_9_dot_0_dot_1_dot_0.bin.irb.<top>(/Users/pgoetze/.rvm/rubies/jruby-9.0.1.0/bin/irb:13) 
from java.lang.invoke.MethodHandle.invokeWithArguments(java/lang/invoke/MethodHandle.java:627) 

有沒有一種方法來創建的JRuby空載體,可以作爲第二個參數,而不是nil通過?

如果沒有,那麼可以通過什麼方式來創建一個字符串屬性?

+0

什麼是有一個堆棧跟蹤'Java的旁邊:: JavaLang :: NullPointerException'? –

+1

我爲它添加了完整的堆棧跟蹤。 –

回答

2

As JRuby wiki states您應該使用反射來獲取對指定其參數類型的構造函數的引用。

java_import java.util.List 
java_import weka.core.Attribute 
#... 
constructor = Attribute.java_class.declared_constructor(java.lang.String, java.util.List) 
attribute = constructor.new_instance('name', nil) 

注:

+0

謝謝,使用反射並從顯式構造函數創建屬性!儘管如此,您不能僅使用單個String參數來使用構造函數,因爲創建的Attribute在內部由Weka作爲* nominal *屬性處理。 –