2017-07-08 26 views
-3

我看到New Java Array of Strings in Nashorn,並找到解決方案。爲什麼這個語法不適用於用nashorn創建Java String數組

但我只是想知道爲什麼我的出身代碼拋出異常:

var JStringArray = Java.type("java.lang.String[]"); 
var validExtensions = new JStringArray(".java", ".class", ".jar", ".xml"); 

唯一的例外是

Exception in thread "main" javax.script.ScriptException: TypeError: Can not create new object with constructor [Ljava.lang.String; with the passed arguments; they do not match any of its method signatures. in ~/scriptMonkey/js/samples/FileStatistics.js at line number 9 
    at jdk.nashorn.api.scripting.NashornScriptEngine.throwAsScriptException(NashornScriptEngine.java:470) 
    at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:454) 
    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) 
    at Debugger.main(Debugger.java:16) 
Caused by: ~/scriptMonkey/js/samples/FileStatistics.js:9 TypeError: Can not create new object with constructor [Ljava.lang.String; with the passed arguments; they do not match any of its method signatures. 
    at jdk.nashorn.internal.runtime.ECMAErrors.error(ECMAErrors.java:57) 
    at jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:213) 
    at jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:185) 
    at jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:172) 
    at jdk.nashorn.internal.runtime.linker.NashornStaticClassLinker.checkNullConstructor(NashornStaticClassLinker.java:108) 
    at jdk.nashorn.internal.runtime.linker.NashornStaticClassLinker.getGuardedInvocation(NashornStaticClassLinker.java:96) 
    at jdk.internal.dynalink.support.CompositeTypeBasedGuardingDynamicLinker.getGuardedInvocation(CompositeTypeBasedGuardingDynamicLinker.java:176) 
    at jdk.internal.dynalink.support.CompositeGuardingDynamicLinker.getGuardedInvocation(CompositeGuardingDynamicLinker.java:124) 
    at jdk.internal.dynalink.support.LinkerServicesImpl.getGuardedInvocation(LinkerServicesImpl.java:154) 
    at jdk.internal.dynalink.DynamicLinker.relink(DynamicLinker.java:253) 
    at jdk.nashorn.internal.scripts.Script$1$FileStatistics.:program(~/scriptMonkey/js/samples/FileStatistics.js:9) 
    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.internal.runtime.Context.evaluateSource(Context.java:1222) 
    at jdk.nashorn.internal.runtime.Context.load(Context.java:839) 
    at jdk.nashorn.internal.objects.Global.load(Global.java:1545) 
    at jdk.nashorn.internal.scripts.Script$\^eval\_.:program(<eval>:1) 
    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) 
    ... 5 more 
+2

爲什麼你不包括例外?這是**爲什麼**它不起作用。 –

+0

@任何一個月後都會倒下的問題解決了,原因是什麼? – aristotll

回答

1

到JStringArray構造函數,你可以通過只數的數組的元素。

var JStringArray = Java.type("java.lang.String[]"); 
var validExtensions = new JStringArray(4); 
validExtensions[0] = ".java"; 
... 

所有的Java陣列型對象是接受單一的論點,即是所述陣列的「長度」的構造。

+0

是因爲Java或Nashorn的實現,第一個參數必須是Array的大小?畢竟我們可以做一些像'final String []字符串; strings = new String [] {「1」};'在Java代碼中。 – aristotll

+0

是的 - 不同的語言,不同的選擇!正如有人在其他Q/A超鏈接中所述,有Java.to函數可以將JS數組轉換爲Java數組。這對您的情況可能會很方便。如果你對此感覺很強烈,你可以提交OpenJDK。 –

相關問題