当前,现场运行的版本是B110,B110是5月24日发出去的。与B110同步拉了一个B111分支,用来定位B110的问题,并出补丁
今天现场发回了一个BUG,定位出来是ClassA出的问题,由于ClassA是个很少会改动的类,头脑一时发晕,就直接在主干上修改,出了补丁发到现场
结果这个问题解决了,却引入了一个新问题。有一段代码一直进不去,异常如下:
Caused by: java.lang.NoSuchMethodError: com.xxx.service.EndVerifyService.execute(Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/String;)Lnet/sf/json/JSONObject;
at cz.xxx.services.inbound_webservices_tickets.v1_0.saservice.InboundWebServicesTicketSaServiceSoapImpl.ttEndVerifyService(InboundWebServicesTicketSaServiceSoapImpl.java:135)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:166)
at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:82)
定位了一下,发现以下代码:
InterfaceB b = new ClassB();
b.execute(arg0,arg1,arg2);
在B110上,ClassB以及其接口InterfaceB上声明的execute()方法是带2个参数的,而经过这些天的修改,在主干上ClassB和InterfaceB的execute()方法已经是3个参数了
我没注意到这个问题,改完ClassA中的bug,就直接把ClassA发到现场,所以当执行到b.execute(arg0,arg1,arg2)这句代码时,就报了NoSuchMethodError
不过当时没有看到这段出错的日志(日志是事后才发现的),只定位出execute()方法有问题,于是在ClassB的execute()中增加了一些调试日志,其中开头第一句是:
logger.debug("into ClassB.execute()");
替换之后发现,这句日志也没有打出来,这才反应过来是这个方法没有进去(不过歪打正着的是,主版本的ClassB发到现场了),再跟B110比对了一下,终于发现是方法的参数不对
于是又把主干上的InterfaceB也发到现场,问题就解决了
不过想想觉得有点不对劲,因为检查发现,ClassB中还有这么一段代码:
String pId = "abc";
String str = XXXConstants.XXX + pId;
那现在一共只发到现场以下3个.class:主干上的ClassA、ClassB、InterfaceB,根本就没有发XXXConstants过去,怎么ClassB不报错呢?
后来想到了,ClassB是在主干上编译的,所以主干上的XXXConstants.XXX,已经作为常量编译到ClassB里了,不需要发补丁到现场
总结:
1、一定要根据实际运行的环境出补丁。像今天这种情况,现场跑的代码是B110版本,主干上的代码已经比B110推进了好多天,2套代码根本就不一致。如果我今天是从B111版本上出补丁,那后面的麻烦事就都没有了
2、如果方法进不去,检查一下这个方法的参数是否正确
3、发补丁时,不能只发修改的类,要把相关的类一起提交
4、要小心static常量的陷阱,比如在ClassC里,有一个String str = XXXConstants.XXX,然后已经编译成了ClassC.class,那str的值就已经确定了。这个时候再去修改XXXConstants.XXX的值,不会对ClassC.class产生影响
分享到:
相关推荐
即使是有多年经验的单片机程序员,也很难一次通过测试就编写出完全无BUG的程序。 BUG的分类: 单片机程序BUG可分为两种类型,一种是显而易见的BUG,如保险管烧毁炸裂等;另一种是条件性BUG,即只有在特定条件下才会...
根据提供的标题、描述以及部分无法正常解析的内容,我们可以推断这篇文章是关于一次特别的编程错误(bug)经历。虽然原始内容包含大量无法识别的字符,但通过标题和描述,我们可以构建一篇关于处理复杂或罕见编程...
#### 一、Bug报告的意义与作用 在软件开发过程中,**Bug报告**是一种至关重要的技术文档。它详细记录了系统在测试过程中的失败模式,是软件测试活动中唯一可触摸到的产品。通过编写高质量的Bug报告,可以有效提高...
### 低级bug耗费12小时Fix:案例分析与经验总结 #### 概述 本文主要探讨一个关于软件开发中的低级bug排查案例,该bug虽然简单却导致了一个原本简单的程序耗时超过12小时才得以修复。通过深入分析这个案例,我们...
总结,cat2bug-jlog是Java开发领域的一个强大工具,它通过实时收集、智能分类和详尽统计等功能,提升了企业应用的运维效率。了解并掌握cat2bug-jlog的使用,无疑能帮助开发者更好地应对复杂的应用场景,实现高效的...
本文基于Kelly Whitmill的专业经验,总结了一系列撰写有效Bug报告的方法。 #### 二、为何撰写有效的Bug报告至关重要 - **减少二次缺陷率**:通过提供详尽的缺陷描述,可以避免开发人员在修复过程中引入新的问题。 -...
在软件开发与测试的过程中,**缺陷报告**(或称为Bug报告)是至关重要的文档之一。它不仅能够帮助开发者快速定位和解决问题,还能够促进测试团队与开发团队之间的有效沟通。因此,撰写高质量的缺陷报告对于提升产品...
在"uview左滑组件bug修复"这个标签下,我们可以推测这个更新是uView的一次小版本迭代,旨在提升组件的稳定性和用户体验。对于使用uView的开发者来说,及时更新到这个修复版本是必要的,以避免遇到类似问题并保持应用...
在软件开发过程中,Bug报告是连接测试人员与开发人员的重要桥梁,它的质量直接影响到问题能否被准确、高效地解决。在99年的Quality Week中,微软测试经理Roger Sherman强调了“不可重现”的Bug报告所带来的问题,...
这份名为“lift-ceshi-bug.rar_测试报告”的文件,显然记录了针对电梯系统平台的一次详细测试过程,旨在发现并修复潜在的问题,以确保系统的稳定性和安全性。测试报告对于系统更新具有指导意义,因为它们提供了宝贵...
在软件测试过程中,编写一份高质量的Bug报告是至关重要的,因为它直接影响到问题能否被有效地识别、理解和解决。本文将深入探讨如何编写优秀的Bug报告,结合具体案例分析,以提升测试工作的效率和质量。 首先,测试...
首先,从内容部分多次出现的“bug”,我们可以推断文档涉及到软件开发过程中不可或缺的一部分——缺陷修复。软件工程师在试用期间可能经历了识别、定位、调试及修正程序中出现的错误(bug)的过程。在软件工程领域,...
编写优秀的Bug报告则是需求分析中不可或缺的一部分,因为它确保了开发团队能准确理解问题,进而有效地修复错误。本篇文章将深入探讨如何撰写高质量的Bug报告,并结合案例分析来提升报告的有效性。 首先,Bug报告的...
综上所述,《最新站长亲测版杏耀源码+采集对接好+BUG已修复+视频搭建教程》这一资料集涵盖了从软件下载到部署上线整个过程中所需的关键技术和实用技巧。对于想要快速构建网站并具备一定编程基础的朋友来说,这无疑是...
他在一次测试经历中,虽然发现了软件bug,但因为测试过程不够严谨,导致bug重现时出现问题。这让他认识到,即使在看似熟悉的工作中,也要保持细心和专注,以确保测试的准确性和有效性。 综合以上内容,2019年软件...
作者通过一次测试新功能的经历,提醒我们不能仅仅停留在发现bug的层面,还要深入探究问题的本质。在填写bug报告时,应详细、准确地描述问题,确保其他团队成员能复现并解决问题。测试人员应该具备敏锐的洞察力,通过...
4. **Bug定位与修复**:“5ڲԹк쵼˳ͻô”这里的描述虽然不够清晰,但可以推测面试官可能会进一步询问关于Bug定位和修复的过程。这通常包括:发现问题时的情境、采取了什么步骤来定位问题、使用了哪些工具和技术...
Java之所以能够流行,主要因为其“一次编写,到处运行”的跨平台特性。 Java程序的运行并不直接在操作系统上执行,而是先通过Java编译器将源代码编译成字节码文件(.class),再由Java虚拟机(JVM)解释执行字节码...