Matlab + Java:尝试使用javabuilder时的java.lang.ExceptionInInitializerError

时间:2010-09-16 23:50:02

标签: java matlab matlab-deployment

我一直在尝试在Windows XP下使用Matlab的javabuilder包,但是在尝试实例化任何javabuilder类时我遇到了一个奇怪的错误。为了说明这个问题,我创建了一个打印MCRROOT和PATH系统变量的简单程序(检查它们是否设置正确)并尝试创建MWCharArray:

import com.mathworks.toolbox.javabuilder.*;
import com.mathworks.toolbox.javabuilder.internal.MCRConfiguration;

class Main
{
   public static void main(String[] args)
   {
       System.out.println("MCRROOT: " + System.getenv("MCRROOT"));
       System.out.println("PATH: " + System.getenv("PATH"));
       System.out.println(MCRConfiguration.isInstalledMCR());
       MWCharArray test = new MWCharArray("Test");
   }
}

执行程序时,输出为:

MCRROOT: C:\Program files\MATLAB\MATLAB Compiler Runtime\v710
PATH: C:\Program files\CollabNet Subversion Client;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program files\MATLAB\MATLAB Compiler Runtime\v710
false
Exception in thread "main" java.lang.ExceptionInInitializerError
        at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration.getMCRRoot(MCRConfiguration.java:77)
        at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration$ModuleDir.<clinit>(MCRConfiguration.java:51)
        at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration.getModuleDir(MCRConfiguration.java:56)
        at com.mathworks.toolbox.javabuilder.internal.MWMCR.<clinit>(MWMCR.java:1447)
        at com.mathworks.toolbox.javabuilder.MWUtil.GetUnknownClassID(MWUtil.java:1258)
        at com.mathworks.toolbox.javabuilder.MWClassID.<clinit>(MWClassID.java:41)
        at com.mathworks.toolbox.javabuilder.MWCharArray.<init>(MWCharArray.java:75)
        at Main.main(Main.java:11)
Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: -1
        at java.lang.String.substring(String.java:1937)
        at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration$MCRRoot.get(MCRConfiguration.java:70)
        at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration$MCRRoot.<clinit>(MCRConfiguration.java:72)
        ... 8 more
Java Result: 1

首先,MCRROOT和PATH的值是否正确?我已经尝试谷歌找出如何设置MCRROOT,但有相互矛盾的结果:一些消息来源说我应该包括de版本目录,其他人则说相反。另外,为什么isInstalledMCR方法返回false?我已经仔细检查了MCR的安装(甚至安装了它并安装了它),为什么图书馆找不到呢?

感谢您提前寻求帮助!

编辑:我也尝试设置MCRROOT没有版本字符串,它也失败了。

2 个答案:

答案 0 :(得分:1)

只是疯狂猜测! Java正在乱用字符串,而你的'mcrroot'包含空格。我可能会将mcr安装路径更改为 C:\ MATLAB \ MATLABCompilerRuntime \ v710 ,省略任何空格和特殊字符。

答案 1 :(得分:0)

我找到了解决方案,所以我发布了一个自我答案供将来参考:除了将javabuilder.jar添加到程序的类路径之外,还必须将MCR运行时库的路径添加到{{1 JDK参数。

我的错误在于,不是将路径设置为MCR安装目录中的库的路径(在我的情况下,java.library.path),而是将运行时目录复制到项目的目录并使用它。似乎javabuilder库使用C:\MATLAB\MCR\v710\runtime\win32变量猜测java.library.path,这将解释奇怪的“StringIndexOutOfBoundsException”。