【问题标题】:ScriptEngine works in java String, but fails in String[]ScriptEngine 在 java String 中工作,但在 String[] 中失败
【发布时间】:2014-08-08 19:33:09
【问题描述】:

以下代码对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]);
        }
    }
}

作为编程新手,我需要帮助来更正此代码。

【问题讨论】:

  • 您能否详细说明“失败”的含义?异常,错误结果,?...
  • 需要更多信息。从海报。如果编译时错误是什么错误?只是 Joop Eggen 指出的那个缺失的分号吗?

标签: java javax.script


【解决方案1】:

(最初缺少分号。)

问题是ScriptEngine.eval(...) 返回一个Object,并且有一个System.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/");

【讨论】:

  • 即使在纠正了缺失的部分后,代码仍然无法正常工作。请处理以作进一步修正。
  • 很好,现在错误应该很清楚了。在遇到 Object 的地方,你得到了 String 预期的东西。
  • 如果我将其纠正为:rani[n]=(String) engine.eval(rani[n]);此运行时错误出现:线程“main”中的异常 java.lang.ClassCastException:java.lang.Double 无法转换为 java.lang.String
  • 是的,表达式的计算结果为双精度/双精度,因为它是数字。是不是很厉害?因此String.valueOf(...)。你也可以"" + eval(...)
  • 您好 Joop Eggen,您发现了一个令人尴尬的错误,请完成语法:String.valueOf(...)。作为编程新手,这对我来说将是一个转折点。请完成代码。
猜你喜欢
  • 2017-05-26
  • 2023-03-14
  • 2014-03-02
  • 2018-03-12
  • 2013-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-16
相关资源
最近更新 更多