当前位置: 首页 > news >正文

实践出真知:MVEL表达式中for循环的坑

目录标题

  • 背景
  • 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循环里面是一个单独的闭包空间,你里面使用的所有的变量都需要提前定义好,不然的话这个闭包空间里面是没有这个变量定义的,然后你的所有针对这个变量的操作就都会跑出空指针异常!

在这里插入图片描述

http://www.lryc.cn/news/479229.html

相关文章:

  • Flutter运行App时出现“Running Gradle task ‘assembleDebug“问题解决
  • 基于SSM(Spring + Spring MVC + MyBatis)框架的咖啡馆管理系统
  • 【SpringBoot】18 上传文件到数据库(Thymeleaf + MySQL)
  • 计算机体系结构之系统吞吐量(三)
  • 高级 HarmonyOS主题课—— 帮助快速构建各种文本识别应用的课后习题
  • windows C#-异常和异常处理概述
  • 每日一题——第一百二十四题
  • 在 CentOS 7 上设置 OpenResty 开机启动
  • 势不可挡 创新引领 | 生信科技SOLIDWORKS 2025新品发布会·苏州站精彩回顾
  • 数仓之全量表、增量表、快照表、切片表、拉链表的基本概念
  • 【富集分析GSEA】如何理解富集分析以及应用
  • 一七五、HTML 不同类型的事件及其说明和示例
  • 数量少的连锁店要不要用智能巡检?
  • 【CSS】外边距塌陷
  • WPF MVVM入门系列教程(二、依赖属性)
  • Springboot集成syslog+logstash收集日志到ES
  • Devops业务价值流:软件研发最佳实践
  • Matplotlib 绘图艺术:从新手到高手的全面指南
  • [ shell 脚本实战篇 ] 编写恶意程序实现需求(恶意程序A监测特定目录B出现特定文件C执行恶意操作D-windows)
  • SQLI LABS | Less-33 GET-Bypass AddSlashes()
  • 界面控件DevExpress WPF中文教程:Data Grid——卡片视图设置
  • flink 内存配置(一):设置Flink进程内存
  • 贪心算法习题其三【力扣】【算法学习day.20】
  • 速盾:高防cdn针对网站的好处有哪些?
  • 【Java SE语法】抽象类(abstract class)和接口(interface)有什么异同?
  • 京准同步:GPS北斗卫星授时服务器发展趋势介绍
  • 鸿蒙多线程开发——并发模型对比(Actor与内存共享)
  • 【计算机网络】章节 知识点总结
  • 开箱即用!265种windows渗透工具合集--灵兔宝盒
  • 怎么在哔哩哔哩保存完整视频