目前总结出来三个字:看日志! 而且是从左到右一个单词一个单词的看。
举个例子:
Spring框架下的一个Demo,启动时报出了以下错误。
一、看异常类型
首先,能看到异常是从引入的SpringFramework依赖中报出来的,具体的路径在黑框中,可以看到关键类“beans”、“factory”、“xml”以及异常类“XmlBeanDefinitionStoreException”。
从关键字可以大致推测,问题是在Bean工厂获取Bean对象前后这个时间段出现的,并且获取Bean对象的方式和xml配置文件有关。具体的异常类型是“XmlBeanDefinitionStoreException”,直接翻译过来的意思是:Xml Bean定义存储异常。问题范围就缩小到在xml中定义bean的方式有问题了。
仅仅是黑框中的异常类路径,就暴露了这么多的信息,所以排错时看日志至关重要。
二、看具详细误信息
Line 21 in XML document from class path resource [beanFirst.xml] is invalid; nested exception is org.xml.sax.SAXParseException;
lineNumber: 21;
columnNumber: 74;
cvc-complex-type.2.4.c: 通配符的匹配很全面, 但无法找到元素 ‘c:bean’ 的声明。
在[beanFirst.xml]这个配置文件中的第21行出错了,这个详细错误信息是SAXParseException异常类告诉我们的,SAX(针对XML的简单API)是基于事件为XML文档的解析器,那么定义错误已经精准定位到beanFirst.xml的第21行了,后面又提示“通配符的匹配很全面, 但无法找到元素 ‘c:bean’ 的声明。” “通配符匹配的很全面”是说,我们在xml中有关通配符的写法没有问题,全都匹配上了。
问题出在元素“c:bean”的声明上,没有这个元素的定义。
我们看到“bean”标签是“beans”下的一个子标签;“c:”是引入了一个Spring自定义的xml依赖,命名空间依赖是全的。而且IDEA没有帮我们排查出错误,这个元素下没有红线、错误提示信息。
回顾第一步,错误类型说明是bean的定义方式不正确,所以推测"c:bean"这种写法不符合规范。
详细错误信息是谁提供给我们的呢?
Application类中test02方法的执行产生了异常对象,第一行是产生异常对象的类,后面的类通过throws关键字将异常对象一层层抛上来。实际上是通过递归的方式。
点开第一个类,找到指定的行数,可以看到异常对象被实例化了出来。
三、具体问题具体分析
到这一步问题已经锁定了,很多情况下锁定问题是很困难的,但是只要锁定了问题,解决问题就有针对性,只差解决问题的方案。
很多人用尝试代替学习,一遇到问题就借助搜索引擎,尝试几种方法后蒙对一次就算解决了,下次遇到类似问题,依然像第一次解决这类问题一样来回尝试。所以总结排错方法很重要,下次面对相似错误的变形,我们依然可以通过上面那套思路锁定问题,大大节省效率。靠尝试代替学习的人工作效率低,靠加班解决问题,岁数大了以后加不动班,或者靠加班也解决不了问题。加班不是努力的表现,过去我也经常加班,从现在起不想再加班了,为此我要优化我的工作方法,以后还会继续做总结,希望大家新的一年都有进步。