目录标题
- 背景
- 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
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) ];
执行的时候就报错了,具体错误信息如下:
[Error: null pointer: parseQuery(query)]
MVEL脚本(正确的)
入参:parseThisUrl=https://xxxxxxxxxx?id=999999&type=123&name=345
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循环里面是一个单独的闭包空间,你里面使用的所有的变量都需要提前定义好,不然的话这个闭包空间里面是没有这个变量定义的,然后你的所有针对这个变量的操作就都会跑出空指针异常!