项目中遇到一个BigDecimal的类型通过三目获取最终值,但是0没有事先转成BigDecimal的类型,强转接类型报错问题记录
public static Object executeStr(String expression, Map<String, Object> env) {
Object object = null;
try {
object = AviatorEvaluator.execute(expression, env);
}
catch(Exception e) {
throw new RuntimeException("规则解析发生异常,表达式:" + expression + ",异常:"+e.getMessage());
}
finally {
return object;
}
}
public static void main(String[] args) {
String expression = "amount>0?amount*100:0";
Map<String, Object> env = new HashMap<String, Object>();
env.put("amount", new BigDecimal(2000));
Object object1 = executeStr(expression, env);
if (object1 instanceof BigDecimal) {
System.out.println("amount:" + env.get("amount") + ";返回的是:" + object1 + ",类型是BigDecimal");
} else {
System.out.println("amount:" + env.get("amount") + ";返回的是:" + object1 + ",类型是:" + object1.getClass());
}
env.put("amount", new BigDecimal(-2000));
Object object2 = executeStr(expression, env);
if (object2 instanceof BigDecimal) {
System.out.println("amount:" + env.get("amount") + ";返回的是:" + object2 + ",类型是BigDecimal");
} else {
System.out.println("amount:" + env.get("amount") + ";返回的是:" + object2 + ",类型是:" + object2.getClass());
}
}
amount:2000;返回的是:200000,类型是BigDecimal
amount:-2000;返回的是:0,类型是:class java.lang.Long
总结:aviator执行返回的结果是原参数的类型,执行了*100返回的结果类型依然是原参数类型,但是如果直接定义返回的类型那么类型是自定义参数的类型,类似我取值就会出问题
public static void main(String[] args) {
String expression = "amount>0?amount*100:0";
Map<String, Object> env = new HashMap<String, Object>();
env.put("amount", new BigDecimal(2000));
Object object1 = executeStr(expression, env);
BigDecimal reObject = (BigDecimal )object1;
}