【问题标题】:a nashorn engine bug?一个nashorn引擎错误?
【发布时间】:2015-05-31 05:01:06
【问题描述】:

我尝试执行这个简单的短脚本来测试 nashorn:

basedir="/cassandara2/cassandra"
ba="/cassandara2/cassandra/lib/ST4-4.0.8.jar";
lib = "";
lib += '      <root url="jar://' + ba.replace(basedir, "$PROJECT_DIR");
print(lib);

效果很好,但是当我在 "$PROJECT_DIR" ==> "$PROJECT_DIR$" 之后添加符号 $ 时,我明白了错误:

> java.lang.StringIndexOutOfBoundsException: String index out of range:
> 13    at java.lang.String.charAt(String.java:646)     at
> jdk.nashorn.internal.objects.NativeRegExp.appendReplacement(NativeRegExp.java:738)
>   at
> jdk.nashorn.internal.objects.NativeRegExp.replace(NativeRegExp.java:674)
>   at
> 
> jdk.nashorn.internal.objects.NativeString.replace(NativeString.java:763)
> bla...

这段代码是否是 jdk 8 nashorn 的错误(我使用了 jdk8 u45):

public static void main(String[] args) {
        try {
            ScriptEngineManager factory = new ScriptEngineManager();
            ScriptEngine engine = factory.getEngineByName("nashorn");

            Object eval = engine.eval("load(\"" + "script/demo.js" + "\");");
            System.out.println(eval);

        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

【问题讨论】:

    标签: java javascript java-8 nashorn


    【解决方案1】:

    这不是一个答案,我没有足够的分数,但你有正则表达式异常,$ 字符是正则表达式特殊字符。尝试逃避它,例如'\\\$'.

    【讨论】:

    • 我认为正则表达式在这里没有问题,因为这个字符串包含 2 个“$”符号!为什么 $PROJECT_DIR 有效但 $PROJECT_DIR$ 无效
    • 尝试测试。我只是看到了异常并做出了一些决定。当你使用正则表达式时,你应该小心正则表达式的特殊字符。
    【解决方案2】:

    已提交错误。 https://bugs.openjdk.java.net/browse/JDK-8081608$ 在替换字符串末尾导致索引超出范围错误

    js> "string".replace("i", "$");
    java.lang.StringIndexOutOfBoundsException: String index out of range: 1
    jjs> "string".replace("i", "$ ");
    str$ ng
    

    【讨论】:

    • 这是 8u20 修复的。
    • 我明白了!非常感谢你!不要以为 jdk 的 bug 太多 :( !无聊!接受你的正确答案!
    【解决方案3】:

    我刚刚使用 2 个不同的 JVM 版本(jdk SE 1.8.0_60-ea-b16 和 jdk SE 1.8.0_45-b14)对此进行了测试,它在 PROJECT_DIR 之前和之后完美地输出了 $ 符号,没有任何例外。

    你能不能给我们一些更详细的信息,比如什么 JDK 实现、操作系统、32/64 位 JDK

    您一定有一些潜在的问题,但作为修复,您可以尝试以下方法

    替换这个 JS 行:

    lib += '      <root url="jar://' + ba.replace(basedir, "$PROJECT_DIR$");
    

    使用这些转义序列中的任何一个

    lib += '      <root url="jar://' + ba.replace(basedir, "\$PROJECT_DIR\$");
    //or
    lib += '      <root url="jar://' + ba.replace(basedir, "$$PROJECT_DIR$$");
    

    【讨论】:

    • 我在 Mac Os x(64 位)中测试过。和 jdk 版本:jdk8 u45。
    【解决方案4】:

    这是原始 JDK 1.8.0 版本中的 a bug。它已在 8u20 更新版本中修复。

    您报告在 Java 8u45 中看到此错误很奇怪,因为该版本肯定包含修复:

    jdk1.8.0_45/bin/jjs
    jjs> "string".replace("i", "$");
    str$ng
    

    您的路径上可能有较旧的 JDK 8 版本吗?

    【讨论】:

    • 我明白了!非常感谢你!不要以为 jdk 的 bug 太多 :( !无聊!
    猜你喜欢
    • 1970-01-01
    • 2019-01-22
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多