5

次のコードは、String rani=String rani = "32*0.25"; のデータの計算を行います。正しい出力が 8.0 になります。

import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
import javax.script.ScriptException;

public class StringMathEngine {

    public static void main(String[] args) throws ScriptException {

        ScriptEngineManager mgr = new ScriptEngineManager();
        ScriptEngine engine = mgr.getEngineByName("JavaScript"); 
        String rani =  "32*0.25";
        System.out.println(engine.eval(rani));
    }
}

ただし、次のコードで使用すると失敗します。

import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
import javax.script.ScriptException;

public class StringMathEngine {

    public static void main(String[] args) throws ScriptException {

        ScriptEngineManager mgr = new ScriptEngineManager();
        ScriptEngine engine = mgr.getEngineByName("JavaScript");



        String[]rani = {"s", "32*0.25", "r", "32*0.75+16", "r", "16", "s", "32"};

        for(int n=0;n<rani.length; n++){
            if(rani[n].equals("s")) {
                rani[n]=rani[n].replaceAll("s","C/");
            }

            else if(rani[n].equals("r")){
                 rani[n]=rani[n].replaceAll("r","D/");
            } 
            else {
                 rani[n]=engine.eval(rani[n]);
            } 

            System.out.println(rani[n]);
        }
    }
}

プログラミングが初めてなので、このコードを修正するには助けが必要です。

4

1 に答える 1

4

(最初はセミコロンがありませんでした。)

問題は、 がScriptEngine.eval(...)返されObjectSystem.out.println(Object). ただし、オブジェクトをに割り当てるとString、適切なエラーが発生します。

for (int n=0; n < rani.length; n++) {
    if (rani[n].equals("s")) {
        rani[n] = rani[n].replace("s","C/");
    } else if(rani[n].equals("r")) {     // ('else' missing)
        rani[n] = rani[n].replace("r","D/"); 
    } else {
        rani[n] = engine.eval(rani[n]);  // Semicolon missing!
        try {
            rani[n] = String.valueOf(engine.eval(rani[n]));
        } catch (ScriptException e) {
            e.printStackTrace(System.out);
        }
    } 
    System.out.println(rani[n]);
}

または、変数を使用することもできます。

engine.put("s", "C/");
engine.put("r", "D/");
于 2014-06-18T13:28:50.713 に答える