private void jButtonStiahniActionPerformed(java.awt.event.ActionEvent evt) {
//start the Rengine (JRI)
String src,symbol1,symbol2 = null,title;
REXP exp2;
Rengine re = new Rengine(null, false, null);
re.eval("library('quantmod')");
if(!boolOanda){
src="yahoo";
symbol1=jComboBoxSymbols.getSelectedItem().toString();
re.eval("kurz=getSymbols('"+symbol1+"',src='"+src+"')");
exp2 = re.eval(symbol1+"$"+symbol1+".Close");
}
else {
src="oanda";
symbol1=jComboBoxSymbols.getSelectedItem().toString();
symbol2=jComboBoxSymbols2.getSelectedItem().toString();
re.eval("kurz=getSymbols('"+symbol1+"/"+symbol2+"',src='"+src+"')");
exp2 = re.eval(symbol1+symbol2);
}
double[] kurz = exp2.asDoubleArray();
re.end();
}
当我尝试第二次推送这个jButton 时,我在java.lang.NullPointerException
获得double[] kurz = exp2.asDoubleArray();
。第一次一切顺利,但第二次我有例外。似乎变量exp2为null,但我不明白为什么。提前谢谢
答案 0 :(得分:0)
嗯,(或许是轻率的)答案是是的,exp2
为空。如果不了解这个REngine
,或者它的eval
方法的逻辑是什么,那就很难添加更多。{1}}我甚至不知道第二次调用boolOanda
的值是什么(或者它是否从第一次调用改变),因此不清楚执行哪个分支来设置exp2
。
我建议将调试器附加到进程,然后逐步调用方法调用并查看实际调用的内容,以及执行何时与您的期望不同。
我猜想也许你的意思是eval symbol1 + '.' + symbol2
(目前这两个符号都是直接连接的)。或者输入可能完全错误,并且第二次调用时符号变量完全为空。但正如我上面所说的那样,我真的不知道动态模型在这里是什么样的,所以最终你必须要找出差异。
答案 1 :(得分:0)
如果exp2为null,则它是这两个赋值之一的结果:
exp2 = re.eval(symbol1+"$"+symbol1+".Close");
或
exp2 = re.eval(symbol1+symbol2);
所以,你需要做一些调试来弄清楚(a)正在执行if(!boolOanda)
的哪个分支,(b)传递给re.eval
的值是什么,以及(c)为什么re.eval
拒绝了他们。