2015-05-31 3 views
4

я пытаюсь выполнить эти простые короткие сценарии для тестирования Насхорн:ошибка двигателя 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(); 
     } 
    } 

ответ

1

Ошибка подана. 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 
+0

Это было исправлено 8u20. – wickund

+0

Я понял! tks u очень много! Не думаю, что в jdk слишком много ошибок :(! Скучно! Принял ваш правильный ответ! –

2

Это не ответ, у меня недостаточно очков, но у вас есть регулярное выражение и $ персонаж - это регулярный символ регулярного выражения. Попытайтесь избежать этого, например. '\\\$'.

+0

Я думаю, что regex здесь не проблема, потому что эта строка содержит знак 2 "$"! почему $ PROJECT_DIR работает, но $ PROJECT_DIR $ не работает –

+0

попробуйте протестировать. Я только что увидел исключение и принял некоторые решения. Когда вы работаете с регулярными выражениями, вы должны быть осторожны с специальными символами регулярного выражения. –

1

Я только что протестировал это с помощью двух разных версий JVM (jdk SE 1.8.0_60-ea-b16 и jdk SE 1.8.0_45-b14), и он отлично отработал оба знака $ до и после PROJECT_DIR без каких-либо исключений.

Можете ли вы дать нам некоторые детали, такие как то, что реализация JDK, OS, 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$$"); 
+0

Я тестировал в Mac Os x (64 бит). И версия jdk: jdk8 u45. –

1

Это в оригинальной версии JDK 1.8.0 a bug. Он был исправлен в выпуске обновления 8u20.

Это странно, что вы сообщаете видеть эту ошибку с Java 8u45, потому что версия определенно содержит исправление:

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

Может быть у вас есть более ранняя версия JDK 8 на вашем пути?

+0

Я получил его! Tks u очень! Не думайте, что в jdk слишком много ошибок :(! –

Смежные вопросы