为什么Java 8的Nashorn引擎在严格模式下在调用apply()并直接传递arguments对象时抛出java.lang.ClassCastException?

时间:2017-07-14 09:49:58

标签: java java-8 classcastexception nashorn

当我使用以下脚本在nashorn引擎上调用eval(在严格模式下)时,我得到一个异常:

var yfunc = function () {
  (null).apply(null, arguments);
};
yfunc();

我严重截断了我的个人情况。第2行的“(null)”可以替换为括号或局部变量之间的任何内容,无论是哪种方式都不应该抛出编译错误,它将产生相同的结果。

问题似乎是明确地将“arguments”作为调用名为“apply”的方法的第二个参数直接传递。以下任何更改都将撤消抛出的异常:

  1. 首先将“参数”放在变量中(但只是将其包装在括号中不起作用!)
  2. 拨打除申请以外的其他内容
  3. 在调用apply
  4. 时,在不同的参数槽中传递“arguments”
  5. 调用print()(带或不带任何参数)作为yfunc()内部的前一行代码(很奇怪吧?)
  6. 为yfunc()
  7. 定义0个以上的参数
  8. 首先绑定yfunc,然后调用绑定方法
  9. 通过Function.apply调用yfunc(而不是使用Function.call调用!)
  10. 引发的异常是:

    Exception in thread "main" java.lang.ClassCastException: Cannot cast jdk.nashorn.internal.runtime.Undefined to jdk.nashorn.internal.runtime.ScriptFunction
    at java.lang.invoke.MethodHandleImpl.newClassCastException(MethodHandleImpl.java:361)
    at java.lang.invoke.MethodHandleImpl.castReference(MethodHandleImpl.java:356)
    at jdk.nashorn.internal.scripts.Script$\^eval\_.:program(<eval>:4)
    at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:637)
    at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:494)
    at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:393)
    at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:449)
    at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:406)
    at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:402)
    at jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:155)
    at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:264)
    

    当我与所有者调用此方法时,抛出的异常会更改。示例代码:

    var yfunc = {
        method: function () {
              (null).apply(null, arguments);
        }
    };
    var x = yfunc.method();
    

    然后抛出的异常如下所示:

    Exception in thread "main" java.lang.ClassCastException: Cannot cast jdk.nashorn.internal.scripts.JO4 to jdk.nashorn.internal.runtime.ScriptFunction
    at java.lang.invoke.MethodHandleImpl.newClassCastException(MethodHandleImpl.java:361)
    at java.lang.invoke.MethodHandleImpl.castReference(MethodHandleImpl.java:356)
    at jdk.nashorn.internal.scripts.Script$\^eval\_.:program(<eval>:5)
    at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:637)
    at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:494)
    at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:393)
    at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:449)
    at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:406)
    at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:402)
    at jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:155)
    at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:264)
    

    到目前为止,我已经专门针对这些环境重现了这个问题:

    • windows 7 64bit - &gt; jdk 1.8.0_60 64bit
    • windows 8 64bit - &gt; jdk 1.8.0_131 64bit

    我似乎无法在互联网上找到类似问题的任何内容。我是否需要向Oracle / OpenJDK报告此内容?

    次要更新

    将项目6和7添加到“以下更改将撤消抛出的异常”列表中。

    最终更新

    提交的错误:JDK-8184720

1 个答案:

答案 0 :(得分:2)

是的,它似乎是一个错误。请提交错误。