一篇文章让你读懂Java异常栈信息
一. 基本的异常打印
public class Test {
public static void main(String[] args) {
fun1();//第4行
}
public static void fun1() {
fun2();//第8行
}
public static void fun2() {
fun3();
}
public static void fun3() {
fun4();
}
}
上述代码打印的异常栈信息是这样的:
java.lang.RuntimeException: fun4
at _27异常栈.Test.fun4(Test.java:32)
at _27异常栈.Test.fun3(Test.java:24)
at _27异常栈.Test.fun2(Test.java:19)
at _27异常栈.Test.fun1(Test.java:15)
at _27异常栈.Test.main(Test.java:11)
首先需要明确的是,在方法的调用链条中,当执行到fun4方法时,虚拟机栈的状态是这样的:
因为程序的方法入口是main,所以虚拟机创建main方法对应的栈帧(栈帧中保存着局部变量表、操作数栈、动态链接等),然后将main栈帧压栈,在执行到第四行的时候,发现调用了fun1方法,则将又创建fun1方法的栈帧并入栈,当执行到第8行调用fun3…
直到进入fun4方法,虚拟机栈的样子就如上图所示。现在虚拟机栈的栈顶是fun4方法,所以执行的是fun4方法,但是在fun4方法中抛出了异常,那么虚拟机生成Exception实例中就会保存整个调用链的虚拟机栈信息
,异常对象生成后fun4方法就会提前结束,Exception对象会一直沿着调用链的反方向移动,直到进入main方法后,被虚拟机捕获,此时才打印出Exception对象中的栈信息。打印的顺序同样是按照出栈顺序打印的。
二. 构建带原因的异常栈
public class Test {
public static void fun1() {
fun2();
}
public static void fun2() {
fun3();
}
public static void fun3() {
try {
fun4();
} catch (Exception e) {
throw new RuntimeException("fun3",e);
}
}
public static void fun4() {
throw new RuntimeException("fun4");
}
public static void main(String[] args) {
fun1();
}
}
打印出来的异常信息如下:
我们可以通过Exception(String message, Throwable cause)
构造器来指定抛出异常的原因,在上面的异常栈信息中,第一部分的java.lang.RuntimeException
是在fun3中抛出的,所以第一部分打印的是从fun3到main的栈信息,但是fun3中抛出的异常中传入了一个cause
,用于设置抛出该异常的原因。
所以就有了第二部分的Caused by
,这个打印的是fun3中捕获的异常的栈信息。而fun4中抛出的异常的栈信息前半部分与第一部分异常栈重合,所以printStackTrace()方法省略了这部分的打印。
2.1 异常栈的流程分析
三. 项目异常实践
理论上来说,异常栈信息最终都能追踪到main
方法或者Thread.run
方法。
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'endpoint' defined in class path resource [cn/uni/app/config/CxfConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.xml.ws.Endpoint]: Factory method 'endpoint' threw exception; nested exception is java.lang.NoSuchFieldError: REFLECTION
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:599) ~[ConstructorResolver.class:4.3.6.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1173) ~[AbstractAutowireCapableBeanFactory.class:4.3.6.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1067) ~[AbstractAutowireCapableBeanFactory.class:4.3.6.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513) ~[AbstractAutowireCapableBeanFactory.class:4.3.6.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[AbstractAutowireCapableBeanFactory.class:4.3.6.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[AbstractBeanFactory$1.class:4.3.6.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[DefaultSingletonBeanRegistry.class:4.3.6.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[AbstractBeanFactory.class:4.3.6.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[AbstractBeanFactory.class:4.3.6.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761) ~[DefaultListableBeanFactory.class:4.3.6.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866) ~[AbstractApplicationContext.class:4.3.6.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542) ~[AbstractApplicationContext.class:4.3.6.RELEASE]
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[EmbeddedWebApplicationContext.class:1.5.1.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737) ~[SpringApplication.class:1.5.1.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370) ~[SpringApplication.class:1.5.1.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) ~[SpringApplication.class:1.5.1.RELEASE]
at org.springframework.boot.web.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:152) [SpringBootServletInitializer.class:1.5.1.RELEASE]
at org.springframework.boot.web.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:132) [SpringBootServletInitializer.class:1.5.1.RELEASE]
at org.springframework.boot.web.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:87) [SpringBootServletInitializer.class:1.5.1.RELEASE]
at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:169) [SpringServletContainerInitializer.class:4.3.6.RELEASE]
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5173) [catalina.jar:8.0.9]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [catalina.jar:8.0.9]
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:724) [catalina.jar:8.0.9]
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:700) [catalina.jar:8.0.9]
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:714) [catalina.jar:8.0.9]
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:919) [catalina.jar:8.0.9]
at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1704) [catalina.jar:8.0.9]
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [na:1.8.0_211]
at java.util.concurrent.FutureTask.run(Unknown Source) [na:1.8.0_211]
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [na:1.8.0_211]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [na:1.8.0_211]
at java.lang.Thread.run(Unknown Source) [na:1.8.0_211]
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.xml.ws.Endpoint]: Factory method 'endpoint' threw exception; nested exception is java.lang.NoSuchFieldError: REFLECTION
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189) ~[SimpleInstantiationStrategy.class:4.3.6.RELEASE]
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588) ~[ConstructorResolver.class:4.3.6.RELEASE]
... 31 common frames omitted
Caused by: java.lang.NoSuchFieldError: REFLECTION
at com.sun.xml.bind.v2.model.impl.RuntimeModelBuilder.<init>(RuntimeModelBuilder.java:87) ~[RuntimeModelBuilder.class:2.1.6]
at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:422) ~[JAXBContextImpl.class:2.1.6]
at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:286) ~[JAXBContextImpl.class:2.1.6]
at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:139) ~[ContextFactory.class:2.1.6]
at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:117) ~[ContextFactory.class:2.1.6]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_211]
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_211]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_211]
at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_211]
at javax.xml.bind.ContextFinder.newInstance(Unknown Source) ~[na:1.8.0_211]
at javax.xml.bind.ContextFinder.newInstance(Unknown Source) ~[na:1.8.0_211]
at javax.xml.bind.ContextFinder.find(Unknown Source) ~[na:1.8.0_211]
at javax.xml.bind.JAXBContext.newInstance(Unknown Source) ~[na:1.8.0_211]
at org.apache.cxf.common.jaxb.JAXBContextCache$2.run(JAXBContextCache.java:348) ~[JAXBContextCache$2.class:3.1.6]
at org.apache.cxf.common.jaxb.JAXBContextCache$2.run(JAXBContextCache.java:346) ~[JAXBContextCache$2.class:3.1.6]
at java.security.AccessController.doPrivileged(Native Method) ~[na:1.8.0_211]
at org.apache.cxf.common.jaxb.JAXBContextCache.createContext(JAXBContextCache.java:346) ~[JAXBContextCache.class:3.1.6]
at org.apache.cxf.common.jaxb.JAXBContextCache.getCachedContextAndSchemas(JAXBContextCache.java:247) ~[JAXBContextCache.class:3.1.6]
at org.apache.cxf.jaxb.JAXBDataBinding.createJAXBContextAndSchemas(JAXBDataBinding.java:472) ~[JAXBDataBinding.class:3.1.6]
at org.apache.cxf.jaxb.JAXBDataBinding.initialize(JAXBDataBinding.java:327) ~[JAXBDataBinding.class:3.1.6]
at org.apache.cxf.service.factory.AbstractServiceFactoryBean.initializeDataBindings(AbstractServiceFactoryBean.java:86) ~[AbstractServiceFactoryBean.class:3.1.6]
at org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean.buildServiceFromClass(ReflectionServiceFactoryBean.java:467) ~[ReflectionServiceFactoryBean.class:3.1.6]
at org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.buildServiceFromClass(JaxWsServiceFactoryBean.java:696) ~[JaxWsServiceFactoryBean.class:3.1.6]
at org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean.initializeServiceModel(ReflectionServiceFactoryBean.java:527) ~[ReflectionServiceFactoryBean.class:3.1.6]
at org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean.create(ReflectionServiceFactoryBean.java:261) ~[ReflectionServiceFactoryBean.class:3.1.6]
at org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.create(JaxWsServiceFactoryBean.java:199) ~[JaxWsServiceFactoryBean.class:3.1.6]
at org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpoint(AbstractWSDLBasedEndpointFactory.java:102) ~[AbstractWSDLBasedEndpointFactory.class:3.1.6]
at org.apache.cxf.frontend.ServerFactoryBean.create(ServerFactoryBean.java:168) ~[ServerFactoryBean.class:3.1.6]
at org.apache.cxf.jaxws.JaxWsServerFactoryBean.create(JaxWsServerFactoryBean.java:211) ~[JaxWsServerFactoryBean.class:3.1.6]
at org.apache.cxf.jaxws.EndpointImpl.getServer(EndpointImpl.java:460) ~[EndpointImpl.class:3.1.6]
at org.apache.cxf.jaxws.EndpointImpl.doPublish(EndpointImpl.java:338) ~[EndpointImpl.class:3.1.6]
at org.apache.cxf.jaxws.EndpointImpl.publish(EndpointImpl.java:255) ~[EndpointImpl.class:3.1.6]
at cn.uni.app.config.CxfConfig.endpoint(CxfConfig.java:40) ~[CxfConfig.class:na]
at cn.uni.app.config.CxfConfig$$EnhancerBySpringCGLIB$$6777d22.CGLIB$endpoint$3(<generated>) ~[CxfConfig.class:na]
at cn.uni.app.config.CxfConfig$$EnhancerBySpringCGLIB$$6777d22$$FastClassBySpringCGLIB$$8922793f.invoke(<generated>) ~[CxfConfig.class:na]
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) ~[MethodProxy.class:4.3.6.RELEASE]
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:356) ~[ConfigurationClassEnhancer$BeanMethodInterceptor.class:4.3.6.RELEASE]
at cn.uni.app.config.CxfConfig$$EnhancerBySpringCGLIB$$6777d22.endpoint(<generated>) ~[CxfConfig.class:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_211]
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_211]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_211]
at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_211]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162) ~[SimpleInstantiationStrategy.class:4.3.6.RELEASE]
... 32 common frames omitted
该异常是SpringBoot项目整合WebService启动时的错误,因为Spring框架抛出了BeanCreationException
导致项目启动失败,而抛出这个异常是因为在ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:599)
中捕获到了BeanInstantiationException
异常,而BeanInstantiationException
异常的抛出又是因为在SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189)
捕获到了NoSuchFieldError
四. 总结
- 异常栈信息的第一行就是抛出这个异常的最原始的位置。
- 异常栈信息的最后一行就是最开始调用的地方。
- 如果异常栈信息后面跟着
Cause by
,就证明抛出当前异常的原因是捕获到了下面的异常。
一篇文章让你读懂Java异常栈信息的更多相关文章
- 一篇文章让你读懂Pivotal的GemFire家族产品
一篇文章让你读懂Pivotal的GemFire家族产品 学习了:https://www.sohu.com/a/217157517_747818
- 一篇文章教你读懂Makefile
makefile很重要 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professiona ...
- 就这?一篇文章让你读懂 Spring 事务
什么是事务 ▲ 百度百科 概括来讲,事务是一个由有限操作集合组成的逻辑单元.事务操作包含两个目的,数据一致以及操作隔离.数据一致是指事务提交时保证事务内的所有操作都成功完成,并且更改永久生效:事务回滚 ...
- 一篇文章带您读懂List集合(源码分析)
今天要分享的Java集合是List,主要是针对它的常见实现类ArrayList进行讲解 内容目录 什么是List核心方法源码剖析1.文档注释2.构造方法3.add()3.remove()如何提升Arr ...
- 一文读懂 Java 异常体系
写程序的时候,编辑器会提示错误,关键字拼错了,语法不符合规则,不符合泛型:程序编译的时候,编译器会提示错误,检查是否符合 Java 的语法规范,没有通过编译器检查的程序就无法编译,也就无法运行.这些都 ...
- 一篇文章教你读懂UI绘制流程
最近有好多人问我Android没信心去深造了,找不到好的工作,其实我以一个他们进行回复,发现他们主要是内心比较浮躁,要知道技术行业永远缺少的是高手.建议先阅读浅谈Android发展趋势分析,在工作中, ...
- 一篇文章带您读懂Map集合(源码分析)
今天要分享的Java集合是Map,主要是针对它的常见实现类HashMap进行讲解(jdk1.8) 什么是Map核心方法源码剖析1.文档注释2.成员变量3.构造方法4.put()5.get() 什么是M ...
- 一篇文章让你搞懂Java中的静态代理和动态代理
什么是代理模式 代理模式是常用的java设计模式,在Java中我们通常会通过new一个对象再调用其对应的方法来访问我们需要的服务.代理模式则是通过创建代理类(proxy)的方式间接地来访问我们需要的服 ...
- 一篇文章让你读懂 OpenStack 的起源、架构和应用
OpenStack 是一个面向 IaaS 层的开源项目,用于实现公有云和私有云的部署及管理.拥有众多大公司的行业背书和数以千计的社区成员, OpenStack 被看作是云计算的未来.目前 OS 基金会 ...
- 一篇文章让你读懂iOS和Android的历史起源
智能手机虽说是移动电话,但我们完全可以将其作为小型化的电脑来思考.这样一来也能够显示出智能手机OS的高性能.我们首先一起来回顾下智能手机OS的历史. OS的黎明期 其实在很早之前就已经有这样的想法,即 ...
随机推荐
- 直播预告丨Hello HarmonyOS进阶系列课程重磅来袭,4月27日开播
为了帮助初识HarmonyOS的开发者快速入门,我们曾推出Hello HarmonyOS系列一共5期课程(传送门:https://developer.huawei.com/consumer/cn/tr ...
- SQL 转置计算
转置即旋转数据表的横纵方向,常用来改变数据布局,以便用新的角度观察.有些转置算法比较简单,比如行转列.列转行.双向转置:有些算法变化较多,比如动态转置.转置时跨行计算.关联转置等.这些转置算法对日常工 ...
- 填报表中也可以添加 html 事件
在实际的项目开发中,填报表的应用十分广泛. 多数情况下,填报表会作为整个项目的一部分配合需求灵活使用,但有时也会受大项目环境的影响,产生一些特别的要求.比如,通常报表单元格的数据类型大多是文本,有时却 ...
- sass 基本常识
一.什么是SASS SASS是一种CSS的开发工具,提供了许多便利的写法,大大节省了设计者的时间,使得CSS的开发,变得简单和可维护. 本文总结了SASS的主要用法.我的目标是,有了这篇文章,日常的一 ...
- 《Effective C#》系列之(六)——提高多线程的性能
一.综述 <Effective C#>中提高多线程性能的方法主要有以下几点: 避免锁竞争:锁的使用会导致线程阻塞,从而影响程序的性能.为了避免锁竞争,可以采用无锁编程技术,如CAS(Com ...
- 力扣1082(MySQL)-销售分析Ⅰ(简单)
题目: 产品表:Product 销售表:Sales 编写一个 SQL 查询,查询总销售额最高的销售者,如果有并列的,就都展示出来. 以 任意顺序 返回结果表. 查询结果格式如下所示. Product ...
- 力扣182(java&python)-数组元素积的符号(简单)
题目: 已知函数 signFunc(x) 将会根据 x 的正负返回特定值: 如果 x 是正数,返回 1 .如果 x 是负数,返回 -1 .如果 x 是等于 0 ,返回 0 .给你一个整数数组 nums ...
- 加入自定义块对fashion_mnist数据集进行softmax分类
在之前,我们实现了使用torch自带的层对fashion_mnist数据集进行分类.这次,我们加入一个自己实现的block,实现一个四层的多层感知机进行softmax分类,作为对"自定义块& ...
- 阿里云RemoteShuffleService新功能:AQE和流控
简介:阿里云EMR自2020年推出Remote Shuffle Service(RSS)以来,帮助了诸多客户解决Spark作业的性能.稳定性问题,并使得存算分离架构得以实施.为了更方便大家使用和扩展 ...
- Let's Fluent:更顺滑的MyBatis
简介: 只需瞅一眼Google Trends上全球Java界最热门的两款SQL映射框架近一年的对比数字,就不难了解其实力分布:在此领域,MyBatis早已占领东亚地区开发者市场,并以绝对优势稳居中国最 ...