1. ホーム
  2. java

[解決済み] ReferenceErrorです。「alert" は定義されていません。

2022-02-05 20:35:10

質問

Javaコードからjavaスクリプトの関数を呼び出そうとしています。

以下は私のJavaコードです。

    public static void main(String[] args) throws FileNotFoundException {
    try {
        /**
         * To call a anonymous function from java script file
         */
        ScriptEngine engine = new ScriptEngineManager()
                .getEngineByName("javascript");
        FileReader fr = new FileReader("src/js/MySpec.js");
        engine.eval(fr);

    } catch (ScriptException scrEx) {
        scrEx.printStackTrace();
    }
}

以下は、私のJavaスクリプトファイルです。

(function() {
  alert("Hello World !!!");
})();

しかし、ドライバクラスのmainメソッドを実行すると、以下のようなエラーが発生します。

Exception in thread "main" javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: "alert" is not defined. (<Unknown source>#2) in <Unknown source> at line number 2
at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:110)
at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:232)
at Java6RhinoRunner.load(Java6RhinoRunner.java:42)
at Java6RhinoRunner.main(Java6RhinoRunner.java:12)

私が知っているのは、それを実行するために何らかのスクリプトエンジンが必要だということです。

そのために、私はrhino.jarファイルをクラスパスに追加しました。

このエラーを解決する方法がわかりません。 どうか助けてください。

解決方法を教えてください。

alert はJavaScriptの一部ではなく window オブジェクトが提供されています。つまり、あなたが使おうとしているコンテキストには存在しないのです。(これは setInterval , setTimeout や、その他のタイマーに関するものです、ご参考までに)

単純なコンソール出力を行いたいだけなら、Rhinoは print 関数に置き換えることができます。 alertprint . スクリプトはすべてのJavaクラスなどにもアクセスできますので、例えば java.lang.System.out.println('Hello'); を使えば、JavaScriptスクリプトから動作させることができます(ただし、提供されている print 関数があります)。また、Javaの変数をスクリプトから利用できるようにするために、簡単に ScriptEngine.put というように、例えば

engine.put("out", System.out);

...そして、スクリプトの中で

out.println('Hello from JavaScript');

...ということで、スクリプトから出力を行う3つ目の方法です :-)

の議論を参照してください。 その javax.script パッケージ・ドキュメント 特に ScriptEngine#put または、より複雑なケースに対応します。 Bindings (そして SimpleBindings ) と ScriptContext .