从Java 6升级到Java 8之后,我的应用程序抛出以下异常:
com.mathworks.toolbox.javabuilder.MWException: Java exception occurred: 
java.lang.NullPointerException
    at java.util.logging.Logger.demandLogger(Logger.java:451)
    at java.util.logging.Logger.getLogger(Logger.java:502)
    at com.mathworks.toolbox.javabuilder.internal.MWMCR.mclFeval(Native Method)
    at com.mathworks.toolbox.javabuilder.internal.MWMCR.access$600(MWMCR.java:23)
    at com.mathworks.toolbox.javabuilder.internal.MWMCR$6.mclFeval(MWMCR.java:833)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at com.mathworks.toolbox.javabuilder.internal.MWMCR$5.invoke(MWMCR.java:731)
    at com.sun.proxy.$Proxy2.mclFeval(Unknown Source)
    at com.mathworks.toolbox.javabuilder.internal.MWMCR.invoke(MWMCR.java:406)
    at mDataEngine.mDataEngineMIF.volatility(mDataEngineMIF.java:7212)这是在使用mathworks库时发生的,后者反过来使用抛出异常的java.util.logging.Logger。
发布于 2017-03-22 17:14:38
甲骨文bug JDK-8145302 NullPointerException at java.util.logging.Logger.demandLogger已被替换为
如果堆栈中没有调用者,JDK-8177325调用程序敏感方法Logger.getLogger,Logger.getAnonymousLogger将抛出NPE。
该bug报告中的解决方法列出如下:
解决办法:使用辅助类来调用Logger.getLogger,而不是直接从JNI调用Logger::getLogger。
从堆栈跟踪中可以看出:
java.lang.NullPointerException
at java.util.logging.Logger.demandLogger(Logger.java:451)
at java.util.logging.Logger.getLogger(Logger.java:502)
at com.mathworks.toolbox.javabuilder.internal.MWMCR.mclFeval(Native Method) 
...com.mathworks.toolbox.javabuilder.internal.MWMCR.mclFeval是一个调用java.util.logging.Logger.getLogger的JNI方法。
Mathworks应该更新MWMCR类,以包含一个java助手方法来调用getLogger,并且应该从JNI而不是直接从getLogger调用该助手方法。
发布于 2015-11-30 10:31:02
这可以通过在启动Java程序时设置以下系统属性来解决:
-Dsun.util.logging.disableCallerCheck=true更详细的资料:
NullpointerException的原因似乎在这里解释:http://www.infoq.com/news/2013/07/Oracle-Removes-getCallerClass
在这里,getCallerClass方法在java.util.logging.Logger中使用:
 public static Logger More ...getLogger(String name) {
     return demandLogger(name, null, Reflection.getCallerClass());
 }这导致变量调用方在java.util.logging.Logger的以下代码中为null:
     if (sm != null && !SystemLoggerHelper.disableCallerCheck) {
         if (caller.getClassLoader() == null) {
             return manager.demandSystemLogger(name, resourceBundleName);
         }
     }
     return manager.demandLogger(name, resourceBundleName, caller);如上文所述,通过设置setting变量,将不会使用调用方变量。
https://stackoverflow.com/questions/33996439
复制相似问题