jdk.nashorn.internal.runtime.ParserException: :5:4 Expected ; but found isStart

ScriptEngineを使ったら

JavaからJavaScriptを呼ぼうとして、エラーが出ました。
下のようなエラーです。

javax.script.ScriptException: :5:4 Expected ; but found isStart
let isStart = false;
^ in at line number 5 at column number 4
at jdk.nashorn.api.scripting.NashornScriptEngine.throwAsScriptException(NashornScriptEngine.java:470)



Caused by: jdk.nashorn.internal.runtime.ParserException: :5:4 Expected ; but found isStart
let isStart = false;

実装したJSは「じゃんけんゲーム」です。調べてみるとglobal変数を使うなら次のように、eval()を使用して定義するとよいみたいだ。参考サイト
具体的に「engine.eval("var value='Hello '+name+'!';");」の部分です。

// Obtain an instance of JavaScript engine
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");

try {
    // Set value in the global name space of the engine
    engine.put("name","Nashorn");
    // Execute an hardcoded script
    engine.eval("var value='Hello '+name+'!';");
    // Get value
    String value=(String)engine.get("value");
    System.out.println(value);
} catch (ScriptException ex) {
    // This is the generic Exception subclass for the Scripting API
    ex.printStackTrace();
}
/********************
 * じゃんけんゲーム    *
 ********************/
 /** グローバル変数 */
let isStart = false;
let cpuTe = 0;
let  janAudi = new Audio("/audio/sample/Jan.m4a");
let  kenAudi = new Audio("/audio/sample/Ken.m4a");
let  ponAudi = new Audio("/audio/sample/Pon.m4a");
let  aikoAudi = new Audio("/audio/sample/Aiko.m4a");
let  showAudi = new Audio("/audio/sample/Show.m4a");
let isAiko = false;
let isPlay = false;

/** オーディオファイル選択 */
function selectAudi() {
    // 音の再生中、じゃんけんルーレットが回っている最中は何もしない
    if (isPlay || isStart) {
        return;
    }
    // 再生ファイル(オブジェクト)を開放する
    janAudi = null;
    kenAudi = null;
    ponAudi = null;
    aikoAudi = null;
    showAudi = null;

    // 選択している先生の名前を取得する
    var selectBox = document.getElementById("select");
    var teacherName = selectBox.value;
    // 再生ファイルを再度セットする
    janAudi = new Audio("/audio/" + teacherName + "/Jan.m4a");
    kenAudi = new Audio("/audio/" + teacherName + "/Ken.m4a");
    ponAudi = new Audio("/audio/" + teacherName + "/Pon.m4a");
    aikoAudi = new Audio("/audio/" + teacherName + "/Aiko.m4a");
    showAudi = new Audio("/audio/" + teacherName + "/Show.m4a");
}

 /** スタートボタン押下時の処理 */
async  function start() {
    if (isStart) {
        return;
    }
    let resImg = document.getElementById("resultImage");
    resImg.style.display = "none";

     if (isAiko == false) {
         janken();
     }
     isStart = true;
     loopCpuTe();
 }

/** CPUの手をルーレットのように回す */
async function loopCpuTe() {
     let pathArray = ["/img/Goo.png", "/img/Choki.png", "/img/Pa.png"];
     let img = document.getElementById("targetImage");
     img.src = pathArray[0];

     var count = 0;
     while (isStart) {
         cpuTe = count;
         img.src = pathArray[cpuTe];
         await sleep(150);
         count++
         if (count > 2) {
            count = 0;
         }
     }
}

/** 各手を押下したときの処理 */
async function stop(te) {
    if (isPlay) {
        return;
    }
    janAudi.paused = true;
    kenAudi.paused = true;

    let result = 0;

    setCpuTe();
    if (te == cpuTe) {
        isPlay = true;
         setWords("あいこで!");
        aikoAudi.play();
        await sleep(1500);
        isPlay = false;
        isAiko = true;
        start();
        return;
    }

    pon();
    isStart = false;
    isAiko = false;
    if ((te + 1) % 3 == cpuTe) {
        result = 1; // YOU_WIN
    }
    if ((te + 2) % 3 == cpuTe) {
        result = 2; // YOU_LOOSE
    }
    await sleep(500);

     let img = document.getElementById("resultImage");
     img.style.disoplay = "block";

    var message = document.getElementById("words");
    if (result == 1) {
        message.innerText = "YOU WIN";
        img.src = "/img/YouWin.png";
    } else if (result == 2) {
        message.innerText = "YOU LOOSE";
        img.src = "/img/YouLoose.png";
    }
    img.style.display = "block";
}

/** 処理を一時停止する */
function sleep(mSec) {
    return new Promise(resolve => setTimeout(resolve, mSec));
}

 /** じゃんけんの再生 */
 async function janken() {
     isPlay = true;
     setWords("じゃん!");
     janAudi.play();
     await sleep(800);
     setWords("けん!");
     kenAudi.play();
     await sleep(300);
     isPlay = false;
 }

/** ポン!(ショ!)の再生 */
 async function pon() {
     isPlay = true;
     if (isAiko) {
         showAudi.play();
         setWords("SHOW!");
     } else {
       ponAudi.play();
       setWords("ポン!");
     }
     isPlay = false;

 }

/** CPUの手を表示 */
function setCpuTe() {
     let pathArray = ["/img/Goo.png", "/img/Choki.png", "/img/Pa.png"];
     let img = document.getElementById("targetImage");
     img.src = pathArray[cpuTe];
}

/** 文言の表示切り替え */
function setWords(moji) {
    let tag = document.getElementById("words").innerText = moji;
}

補足

こちらからJavaで扱うJavaScritptのチュートリアルが見れました。
でわでわ。。。

投稿者:

takunoji

音響、イベント会場設営業界からIT業界へ転身。現在はJava屋としてサラリーマンをやっている。自称ガテン系プログラマー(笑) Javaプログラミングを布教したい、ラスパイとJavaの相性が良いことに気が付く。 Spring framework, Struts, Seaser, Hibernate, Playframework, JavaEE6, JavaEE7などの現場経験あり。 SQL, VBA, PL/SQL, コマンドプロント, Shellなどもやります。

コメントを残す