目录标题
- 背景
- MVEL脚本(有问题的)
- MVEL脚本(正确的)
- 结论分析
背景
需要从一个URL的拼接参数中解析出id的值并输出
比如:
存在URL=https://xxxxxxxxxx?id=999999&type=123&name=345
然后需要输出id=999999
MVEL脚本(有问题的)
入参:parseThisUrl=https://xxxxxxxxxx?id=999999&type=123&name=345
java">import java.net.URL;
import java.util.*;def parseQuery(query) {params = new HashMap();if (query != null) {String[] pairs = query.split("&");for(pair : pairs) {String[] kvs = pair.split("=");if(kvs.length == 2){params.put(kvs[0], kvs[1]);}}}return params;
}// 解析URL
URL parsedUrl = new URL(parseThisUrl);
// 获取查询字符串
String query = parsedUrl.getQuery();
// 解析查询字符串
parameters = parseQuery(query);
//获取goodId
goodId = parameters.getOrDefault("id","0");return [ "goodId" : Long.valueOf(goodId) ];
执行的时候就报错了,具体错误信息如下:
java">[Error: null pointer: parseQuery(query)]
MVEL脚本(正确的)
入参:parseThisUrl=https://xxxxxxxxxx?id=999999&type=123&name=345
java">import java.net.URL;
import java.util.*;def parseQuery(query) {params = new HashMap();if (query != null) {String[] pairs = query.split("&");String[] kvs;for(pair : pairs) {kvs = pair.split("=");if(kvs.length == 2){params.put(kvs[0], kvs[1]);}}}return params;
}// 解析URL
URL parsedUrl = new URL(parseThisUrl);
// 获取查询字符串
String query = parsedUrl.getQuery();
// 解析查询字符串
parameters = parseQuery(query);
//获取goodId
goodId = parameters.getOrDefault("id","0");return [ "goodId" : Long.valueOf(goodId) ];
很突然啊,偷袭,一下就成功了!!!
结论分析
感觉是这个原因,for循环里面是一个单独的闭包空间,你里面使用的所有的变量都需要提前定义好,不然的话这个闭包空间里面是没有这个变量定义的,然后你的所有针对这个变量的操作就都会跑出空指针异常!