最近我负责的某个项目新增了功能,然而发版之后就报错,具体日志报下面的问题
java.lang.NullPointerException
at java.util.regex.Matcher.getTextLength(Matcher.java:1283)
at java.util.regex.Matcher.reset(Matcher.java:309)
at java.util.regex.Matcher.<init>(Matcher.java:229)
at java.util.regex.Pattern.matcher(Pattern.java:1093)
at java.util.Formatter.parse(Formatter.java:2547)
at java.util.Formatter.format(Formatter.java:2501)
at java.util.Formatter.format(Formatter.java:2455)
at java.lang.String.format(String.java:2940)
at com.orgexample.common.core.exception.BusinessException.<init>(BusinessException.java:36)
at com.orgexample.common.core.exception.BusinessException.<init>(BusinessException.java:26)
at com.orgexample.tourism.tourism.util.DstZipUtil.compressFileList(DstZipUtil.java:46)
at com.orgexample.tourism.tourism.versionfile.service.VersionFileService.generateZipFile(VersionFileService.java:142)
at com.orgexample.tourism.tourism.versionfile.service.VersionFileService.generateVersionZipFile(VersionFileService.java:97)
at com.orgexample.tourism.tourism.support.ExecutionApiTimerTaskService.generateJsonOfflinePackage(ExecutionApiTimerTaskService.java:331)
at com.orgexample.tourism.tourism.support.ExecutionApiTimerTaskService.executeTimeTask(ExecutionApiTimerTaskService.java:212)
at com.orgexample.tourism.tourism.support.ExecutionApiTimerTaskService.updateDstApiManageVersion(ExecutionApiTimerTaskService.java:80)
at com.orgexample.tourism.tourism.support.ExecutionApiTimerTaskService$$FastClassBySpringCGLIB$$c7558311.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:746)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.lang.Thread.run(Thread.java:750)
根据异常,显然定位到发生问题的异常代码在下面的代码中
/**
* 批量压缩文件 v4.0
*
* @param fileNames 需要压缩的文件名称列表(包含相对路径)
* @param zipOutName 压缩后的文件名称
**/
public static void compressFileList(String zipOutName, List<String> fileNameList) {
ThreadFactory factory = new ThreadFactoryBuilder().setNameFormat("compressFileList-pool-").build();
// ExecutorService executor = new ThreadPoolExecutor(5, 10, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>(20), factory);
ExecutorService executor = Executors.newFixedThreadPool(40, factory);
ParallelScatterZipCreator parallelScatterZipCreator = new ParallelScatterZipCreator(executor);
try (OutputStream outputStream = new FileOutputStream(zipOutName)) {
ZipArchiveOutputStream zipArchiveOutputStream = new ZipArchiveOutputStream(outputStream);
zipArchiveOutputStream.setEncoding("UTF-8");
for (String fileName : fileNameList) {
File file = new File(fileName);
getFiles(parallelScatterZipCreator, file.getName(), file);
}
parallelScatterZipCreator.writeTo(zipArchiveOutputStream);
zipArchiveOutputStream.close();
} catch (IOException | ExecutionException | InterruptedException e) {
throw new BusinessException(e.getMessage());
}
}
这里麻烦各位先忽略这个代码的槽点吧,我也很想吐槽,但是这是 21 点的代码,不知道是哪位离职的同事写的,改是没法改了,只能将就着看了
由于生产环境不能 Debug 调试,所以只能确定是这里出了空指针异常,但是不知道具体是哪里出了异常,又是因为什么出的异常
我新增的功能联系了三张表,我尝试将这三张表都提取出来,在本地环境还原到没部署前的节点,此时在本地运行该接口,并不会报错,但是在生产环境就报错,而且该问题是在我新版本发版之后产生的,确定过好几遍,数据库是没问题的,几乎是保证和生产环境和本地环境一致了,然而在本地就是没问题,在生产就是有问题
代码问题也排查过了,进入部署的 jar 包中查看发现本次发版部署的代码也存在
生产环境的权限只有运维有权限操作,我一个开发尽可能就不想打印很多日志然后让生产部署上去再运行一遍查看效果就是,所以打印更详细的日志这个方法还没使用
想问问各位知道出现这种问题有什么解决思路吗?我想先试试你们的解决方法,如果能解决就不搞这么麻烦了
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.