Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以严格计算Java中存储为字符串的布尔表达式吗?_Java_Boolean_Eval_Beanshell - Fatal编程技术网

我可以严格计算Java中存储为字符串的布尔表达式吗?

我可以严格计算Java中存储为字符串的布尔表达式吗?,java,boolean,eval,beanshell,Java,Boolean,Eval,Beanshell,我希望能够计算存储为字符串的布尔表达式,如下所示: "hello" == "goodbye" && 100 < 101 一点也不麻烦。有谁知道FOSS解析器会因为操作数不匹配之类的事情而抛出错误?或者在比恩希尔有一个可以帮助我的环境?我已经尝试过解释器.setStritJava(true) 为了完整起见,以下是我目前使用的代码: Interpreter interpreter = new Interpreter(); interpreter.setStrictJava(t

我希望能够计算存储为字符串的布尔表达式,如下所示:

"hello" == "goodbye" && 100 < 101

一点也不麻烦。有谁知道FOSS解析器会因为操作数不匹配之类的事情而抛出错误?或者在比恩希尔有一个可以帮助我的环境?我已经尝试过解释器.setStritJava(true)

为了完整起见,以下是我目前使用的代码:

Interpreter interpreter = new Interpreter();
interpreter.setStrictJava(true);    
String testableCondition = "100 == \"hello\"";
try {
    interpreter.eval("boolean result = ("+ testableCondition + ")");
    System.out.println("result: "+interpreter.get("result"));
    if(interpreter.get("result") == null){
        throw new ValidationFailure("Result was null");
    }
} catch (EvalError e) {
    e.printStackTrace();
    throw new ValidationFailure("Eval error while parsing the condition");
}
编辑:

我当前拥有的代码返回此输出

result: false

没有错误。我想让它做的是抛出一个EvalError或其他东西,让我知道存在不匹配的操作数。

试试Java 6中的

,您可以动态调用编译器,如本文所述:

您可以使用它将表达式动态编译为Java类,如果您尝试将字符串与数字进行比较,则会引发类型错误。

使用Janino


它类似于java的eval,MVEL也很有用

在大多数情况下,执行评估的一行代码:

Object result = MVEL.eval(expression, rootObj);

“rootObj”可以为null,但如果提供了它,则可以引用其上的属性和方法,而无需进行限定。例如,“id”或“calculateMething()”

如果groovy是一个选项,您可以尝试使用它。

您当前的代码有什么问题吗?“有人知道FOSS解析器”==离题问题,这是一个很棒的链接。不幸的是,我需要一些与java 1.5兼容的东西。eval非常好,但我还需要一个string=functions
Object result = MVEL.eval(expression, rootObj);