web项目应用开发时,在一个bean中定义了一个实例方法,并使用forEach对实例方法中的一个局部List集合遍历,产生如下报错
完整报错信息
Failed startup of context org.mortbay.jetty.webapp.WebAppContext@1a6f5124{/vipSystem,D:\gaotime-vip-online\gaotime-admin\webapps\vipSystem\src\main\webapp}
java.lang.ArrayIndexOutOfBoundsException: 20993
at org.springframework.asm.ClassReader.readClass(Unknown Source)
at org.springframework.asm.ClassReader.accept(Unknown Source)
at org.springframework.asm.ClassReader.accept(Unknown Source)
at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:54)
at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:80)
at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:101)
at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:76)
at org.springframework.context.annotation.ConfigurationClassUtils.checkConfigurationClassCandidate(ConfigurationClassUtils.java:69)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:216)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:178)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:617)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:446)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:384)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:283)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111)
at org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:549)
at org.mortbay.jetty.servlet.Context.startContext(Context.java:136)
at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1282)
at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:518)
at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:499)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
at org.mortbay.jetty.Server.doStart(Server.java:224)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at runjettyrun.Bootstrap.main(Bootstrap.java:97)
定位到代码中的报错位置:
public class WeChatInfoTask {
private final Logger logger = LoggerFactory.getLogger(WeChatInfoTask.class);
public void taskExecution() {
try {
logger.info("开始");
Queue<String> wechatInfoQueue = WeChatInfoQueue.getInstance().getWeChatInfoQueue(); //获取单例对象中的队列
if (!wechatInfoQueue.isEmpty()) {
while (wechatInfoQueue.size() > 0) {
String wechatmag = wechatInfoQueue.poll();
InputStream in = new ByteArrayInputStream(wechatmag.getBytes());
//1.创建Reader对象
SAXReader reader = new SAXReader();
//2.加载xml
Document document = reader.read(in);
//3.获取根节点
Element rootElement = document.getRootElement();
List<Element> elements = rootElement.elements();
JSONObject msgJsonObject = new JSONObject();
//报错位置:
elements.forEach(element->{
msgJsonObject.put(element.getName(), element.getStringValue());
});
logger.info("结束");
} catch (Exception e) {
logger.info(e.getMessage());
}
}
}
更换此处报错代码为:
for (Element element : elements) {
msgJsonObject.put(element.getName(), element.getStringValue());
}
正常启动(lambda表达式会判空,正常使用foreach循环遍历list集合是需要先判空的,这里只是为了测试,就没有做此步骤了);
很显然是环境问题;由于jdk版本是1.8,排除jdk无法编译的问题,怀疑是jetty版本过低导致,更换tomcat8启动,仍然报错,怀疑是spring的版本问题,升级spring版本,正常启动,查阅相关资料,spring4才支持lambda表达式,低于此版本的spring都是不支持lambda表达式的。