Android Studio使用Rhino执行含Math.pow表达式报语法错误如何解决?
问题修复方案
错误根因
- Rhino引擎执行的是JavaScript语法,你拼接的表达式中使用了Java特有的
(float)强制类型转换语法,JavaScript不识别该语法,因此触发语法解析错误,该报错和Math.pow本身无关。 - 你调用
engine.eval时额外添加的开头;本身不会触发错误,但属于冗余内容。
修复步骤
1. 移除Java语法标记
删除拼接equation时的(float)前缀,以及eval时开头多余的;。
2. 替换为JS兼容的类型转换逻辑
如果需要确保返回值为浮点类型,可在JS表达式中使用parseFloat()包裹,或者在Java层拿到执行结果后做类型转换。
3. 优化x^匹配逻辑(可选但必要)
现有代码中使用func.indexOf(c)获取x的位置,当表达式存在多个x时会永远匹配第一个x的位置,导致逻辑错误,直接用当前循环下标i读取相邻字符即可。
修复后的核心代码
private Object place_X_in_func(String raw_func, float num){ String func = raw_func.replace(" ", ""); StringBuilder equation = new StringBuilder(); // 用StringBuilder拼接更高效 int i = 0; while(i < func.length()) { boolean isPow = false; char c = func.charAt(i); if(c == 'x' || c == 'X'){ // 直接用当前下标i判断后续字符,不要用indexOf if(i + 1 < func.length() && func.charAt(i+1) == '^'){ if(i + 2 < func.length()){ char z = func.charAt(i+2); equation.append("Math.pow(").append(num).append(",").append(z).append(")"); i+= 3; isPow = true; } } else{ equation.append(num); } } else { equation.append(c); } if(!isPow){ i += 1; } } ScriptEngine engine = new ScriptEngineManager().getEngineByName("rhino"); try { System.out.println("EQ => "+equation); // 移除了开头的;和之前的(float)前缀 Object result = engine.eval(equation.toString()); // Java层转float按需开启 // float floatResult = ((Number) result).floatValue(); System.out.println(result); return ("R:"+result); } catch (ScriptException e) { System.out.println(e.getMessage()); } return 0; }
测试验证
你示例的表达式2*Math.pow(NaN,2)-1在修复后可正常执行,返回结果为NaN符合预期。
内容的提问来源于stack exchange,提问作者GeverAL
相关产品推荐
相关产品推荐

