方程式解析错误(java)

方程式解析错误(java),java,equation,Java,Equation,我有以下代码: public class Parse { static double eval(String exp) { ScriptEngineManager mgr = new ScriptEngineManager(); ScriptEngine engine = mgr.getEngineByName("JavaScript"); String stringResult = null; try {

我有以下代码:

public class Parse {
    static double eval(String exp) {
        ScriptEngineManager mgr = new ScriptEngineManager();
        ScriptEngine engine = mgr.getEngineByName("JavaScript");
        String stringResult = null;
        try {
            ArrayList<Variable> vars = askForVars(parse1(exp));
            ArrayList<String> usednames = new ArrayList<String>();
            for (Variable v : vars) {
                if (!usednames.contains(v.name)) {
                    stringResult = replaceString(exp, v.name, "" + v.valueUsed);
                    usednames.add(v.name);
                }
                return Double.parseDouble(engine.eval(stringResult.toString())
                        .toString());
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return 0.0;
    }

    static ArrayList<Variable> parse1(String exp) {
        ArrayList<Variable> variables = new ArrayList<Variable>();
        ScriptEngineManager mgr = new ScriptEngineManager();
        ScriptEngine engine = mgr.getEngineByName("JavaScript");
        String stringResult;
        try {
            stringResult = exp;
            for (Character c : stringResult.toCharArray()) {
                if (c.isLetter(c)) {
                    variables.add(new Variable(c.toString(), 1.0));
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return variables;
    }

    static ArrayList<Variable> askForVars(ArrayList<Variable> as) {
        ArrayList<Variable> result = new ArrayList<Variable>();
        ArrayList<String> usednames = new ArrayList<String>();
        for (Variable v : as) {
            if (!usednames.contains(v.name)) {
                System.out.print("Value of " + v.name + ": ");
                Double input = Double.parseDouble(MessageUtil.getInput());
                result.add(new Variable(v.name, input));
                usednames.add(v.name);
            }
        }
        return result;
    }

    static String replaceString(String s, String from, String to) {
        return s.replaceAll(from, to);
    }
}
公共类解析{
静态双值(字符串扩展){
ScriptEngineManager mgr=新建ScriptEngineManager();
ScriptEngine=mgr.getEngineByName(“JavaScript”);
字符串stringResult=null;
试一试{
ArrayList vars=askForVars(parse1(exp));
ArrayList usednames=新的ArrayList();
for(变量v:vars){
如果(!usednames.contains(v.name)){
stringResult=replaceString(exp,v.name,“+v.valueUsed);
使用名称。添加(v.名称);
}
返回Double.parseDouble(engine.eval(stringResult.toString())
.toString());
}
}捕获(例外情况除外){
例如printStackTrace();
}
返回0.0;
}
静态ArrayList parse1(字符串exp){
ArrayList变量=新的ArrayList();
ScriptEngineManager mgr=新建ScriptEngineManager();
ScriptEngine=mgr.getEngineByName(“JavaScript”);
字符串字符串结果;
试一试{
stringResult=exp;
for(字符c:stringResult.toCharArray()){
如果(c.c)){
添加(新变量(c.toString(),1.0));
}
}
}捕获(例外情况除外){
例如printStackTrace();
}
返回变量;
}
静态ArrayList askForVars(ArrayList as){
ArrayList结果=新建ArrayList();
ArrayList usednames=新的ArrayList();
for(变量v:as){
如果(!usednames.contains(v.name)){
系统输出打印(“值“+v.name+”:”);
Double-input=Double.parseDouble(MessageUtil.getInput());
添加(新变量(v.name,input));
使用名称。添加(v.名称);
}
}
返回结果;
}
静态字符串替换字符串(字符串s、字符串from、字符串to){
返回s.replaceAll(从,到);
}
}
当我只有一个变量(例如:2x、3x+2x等)时,这是可以的,但当我使用多个变量(例如:x+y、3x-3y等)时,问题就出现了

这就是错误:

x:3的值y:4 javax.script.ScriptException:sun.org.mozilla.javascript.internal.EcmaError:ReferenceError:y未定义。(#1)在com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:156)在com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:170)在javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:247)在com.company.Parse.eval(Parse.java:24)在com.company.MessageUtil.createExp的第1行com.company.Main.Main(Main.java:28)上的(MessageUtil.java:97)x+y解析为:0.0


更复杂的代码到底发生了什么?
x:3的值y:4的值javax.script.ScriptException:sun.org.mozilla.javascript.internal.EcmaError:ReferenceError:“y”没有定义。(#1)在com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:156)的第1行com.company.Parse.eval(Parse.java:24)com.company.MessageUtil.createExp(MessageUtil.java:97)com.company.Main.Main(Main.java:28)x+y解析为:0.0