Java后端 - 常见BUG及其处理策略(持续更新中~)

news2024/9/20 16:35:36

Bug 收集与总结

本文记录的是 本人SpringBoot 后端项目使用和运行代码时所遇到的各种问题,全部都已解决,欢迎在评论区补充你遇到的 Bug 哦!仅以本文记录学习社区项目时,所遇到的奇奇怪怪的 bug,以及一些很愚蠢的错误,以警醒自己不再犯同样的错误,共勉!一起进步!

编译时错误


Maven包dependency报红

依赖中有付费包 => 叫同事发你一份,复制到repository包的指定目录结构的相应位置
依赖中有私包 => 叫同事发你一份settting.xml文件,并修改maven的settting文件包路径

 !!!还有就是假报错,如果项目能运行启动就不用管它是否爆红。

编译项目时显示out of memory,但是电脑的内存是足够 或者 Error:java: Compilation failed: internal java compiler error


原因:

idea默认给的build project的heap内存不够大,修改下图箭头位置的数值即可。
具体修改位置为:
File => setting => Build,Execution,Deployment => Compiler => Shared build process heap size(Mbytes):


Error:java: Compilation failed: internal java compiler error


可能的原因是

  上面的堆内存分配不足 或者 IDE配置的项目JVM版本与JDK版本不一致
   修改的地方有:

File => Project Structure => Module 检查每个模块是否合理,一般都是使用1.8的,如果出现1.5或者11等,则修改回来即可


File => Settings => Build,Execution,Deployment => Compiler => Java Compiler,这里也是检查一下每个模块是否合理


运行时异常


NPE - 空指针异常(Null pointer Exception)


一个优秀的攻城狮必须要避免空指针异常导致的程序不能运行的问题,对于该if进行判断的一定要进行判断。

有现成的工具类就用现成的,自己写很可能漏掉判断逻辑。

--对象判空:使用ObjectUitls来判断对象是否为空。
--数组判空:使用CollectionUtils来判断是否为空。
--字符串判空:使用StringUtils来判断是否为空或者字符串是否为空字符串。
--字符串和魔法值比较:比较"rainxxbow"和values,不要写成values.equals(“rainxxbow”),如果你没有对values进行判空,则会出现NPE问题,好的习惯是写成"rainxxbow".equals(values)(其实这里也有问题,不要直接魔法值,而是写成一个静态常量或者枚举更好)


NFE - 字符串转换为数字异常(Java.lang.NumberFormatException)


场景
当试图将一个String转换为指定的数字类型,而该字符串确不满足数字类型要求的格式时,抛出该异常.如现在讲字符型的数据“123456”转换为数值型数据时,是允许的。但是如果字符型数据中包含了非数字型的字符,如123#56,此时转换为数值型时就会出现异常。系统就会捕捉到这个异常,并进行处理。

解决方案
限制好前端的输入 或者 数据字段的格式
对String类型的数据进行判断是否存在非数值的内容,否则不进行处理(try … catch …)


CCE - 类型转换异常(ClassCastException)
FNFE - 文件未找到异常(Java.lang.FileNotFoundException)


场景
当程序试图打开一个不存在的文件进行读写时将会引发该异常。该异常由FileInputStream,FileOutputStream,RandomAccessFile的构造器声明抛出,即使被操作的文件存在,但是由于某些原因不可访问,比如打开一个只读文件进行写入,这些构造方法仍然会引发异常。

解决:
手动查看文件是否存在 或者 查看文件是否符合文件读写要求

AOE - 访问越界异常(ArrayIndexOutOfBoundException)


场景
--访问不存在的索引:当你尝试访问数组中一个不存在的索引时,比如数组长度为5,却尝试访问索引6或更大数据时,就会抛出这个异常。数组的合法索引范围是0到数组长度减1。
--循环条件错误:在遍历数组的循环中,如果循环条件设置不当,可能导致索引超出数组边界。例如,使用<=而不是<作为终止条件。
--动态数组操作不当:在动态改变数组内容时(如添加或删除元素),如果没有正确调整后续的索引访问,可能会导致越界。
--初始化错误:数组没有正确初始化,或者初始化时的大小设置不正确,然后尝试访问其中的元素。
解决方案
解决ArrayIndexOutOfBoundsException的方法包括:

--检查索引边界:在访问数组元素前,总是检查索引是否在有效范围内。可以使用条件语句确保索引index >= 0 && index < array.length。
--使用循环时小心边界:确保循环迭代时不会超过数组的最后一个元素。例如,使用for(int i = 0; i < array.length; i++)而不是i <= array.length。
--初始化数组时指定正确大小:确保数组在创建时就给予合适的大小,如果数组大小可能变化,考虑使用动态数据结构如ArrayList。
--异常处理:使用try-catch语句块捕获ArrayIndexOutOfBoundsException,并在catch块中处理异常情况,比如提供错误提示或进行安全的回退操作。
--代码审查和测试:在代码审查阶段注意检查所有数组访问的边界条件,同时编写单元测试,特别是边界条件测试,确保数组操作的安全性。
--使用工具辅助:利用IDE的静态代码分析功能,可以帮助提前发现可能的数组越界问题。
通过以上措施,可以有效预防和解决ArrayIndexOutOfBoundsException问题,提升代码的健壮性和可靠性。

CNFE - 类未找到异常(ClassNotFoundException)


场景:
ClassNotFoundException(类未找到异常)**在Java中出现的情况主要是当Java虚拟机(JVM)尝试加载一个特定的类,但是找不到对应的.class文件时。**这意味着类没有被包含在类路径(class path)中,或者类加载器无法访问到这个类。这类异常通常发生在以下几种情境:

类名拼写错误:确保在代码中引用的类名与实际的类名完全一致,包括大小写。
类路径问题:检查项目的类路径设置,确保所有需要的类文件和JAR包都被包含进来。可以通过调整IDE的配置,或者在命令行使用java -cp来指定正确的类路径。
依赖管理不当:如果你的项目依赖于外部库,确保所有必要的依赖都已经被正确安装并且版本兼容。使用构建工具如Maven或Gradle可以帮助自动管理这些依赖。
类文件不存在:确认相关的.class文件或JAR包实际上存在于预期的位置。
类加载器问题:在某些复杂的环境中,如使用了自定义类加载器,确保类加载机制正确无误。
访问权限问题:确保JVM有足够的权限访问类文件,特别是在类文件位于受保护的目录或网络资源上时。
解决方案:
核对类名拼写:仔细检查并修正类名拼写。
检查类路径:确保类路径设置正确,必要时重新配置。
验证依赖:使用构建工具确保所有依赖都已正确下载和链接。
确认类文件存在:通过文件浏览器或命令行确认类文件的实际位置和存在性。
检查类加载器逻辑:如果使用了自定义类加载器,检查其实现逻辑。


Mybatis-plus框架的count优化问题


场景:
时间:2024-05-27
需求:添加一个Excel导入功能,可以批量添加数据
需求很简单,很快做完,但是查询出问题了。(心里ps:wtf,我搞个导入和批量插入,关查询什么问题,什么bug突然扣我头上了?)


本来是一对多的数据,但是总数只显示总表的数据个数

日志如下:


很明显,count的SQL并没有联表的部分,导致只查询总表的数据个数,进而导致分页出现问题。

一番摸索后,查看源码,发现count方法会对比联表的表字段有没有在where后面用到,如果没有就会被优化掉,进而出现这个总数不对的问题。

解决方案
禁用count优化

Page<Xxxx> xxx= new Page<>(pageQuery.getPage(), pageQuery.getSize());
// 禁用count优化
pdmProcessRecordVoPage.setOptimizeCountSql(false);
Page<Yyyy> yyyy= ZzzMapper.getData(xxx);

禁用Mybatis-plus的count方法,使用自己写的count方法

Page<Xxxx> xxx= new Page<>(pageQuery.getPage(), pageQuery.getSize());
pdmProcessRecordVoPage.setOptimizeCountSql(false);
pdmProcessRecordVoPage.setSearchCount(false);
Page<Yyyy> yyyy= ZzzMapper.getData(xxx);


方案对比
直接禁用count优化更好一点

  不用再去查询一次SQL获取TOTAL值
  不用在写/复制SQL导致SQL冗余问题
综上:
 选择禁用count优化

如何快速定位问题并解决?


整体步骤

先根据出现的问题或者反馈的bug,大致区分是前端问题还是后端问题
然后按照是哪个具体步骤可能的问题进行深入分析 或者 根据经验和业务,边界定位法
 

辅助:

debug
打日志,在关键节点打日志或者在catch里面

Spring-boot-maven-plunge 爆红

<plugins>
    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
</plugins>
  • 下载失败,添加阿里云镜像
  • 加上相应的版本号

依赖下载或者导入失败

  • 查找顺序:本地仓库、镜像仓库(国内)、中央仓库(国外)

  • 解决方法:

    • 设置镜像

  • <!--阿里云镜像(淘宝镜像)-->
    <mirrors>
    <mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>*</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>;
    </mirror>
    </mirrors>
    

  • 设置私服仓库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2095579.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从马斯洛需求层次理论谈职场激励

马斯洛需求层次理论是一个广为人知的心理学概念&#xff0c;它是由美国心理学家亚伯拉罕马斯洛&#xff08;Abraham Maslow&#xff09;于1943年提出&#xff0c;常被描述为一个5层的金字塔模型&#xff0c;反映了人类不同需求层级和依赖关系。马斯洛认为人类只有在低层级需求得…

在 VS Code 中使用 Git 源代码管理【Mac 版】

文章目录 一、Git 使用文档二、使用示例1、复制远程仓库地址2、查看当前所在的分支2.1、界面查看2.2、终端查看 3、修改/新增文件4、显示增改的详细内容5、添加暂存区6、查看/取消暂存的更改7、提交本地代码库8、待提交文件9、推送到远程仓库10、验证11、查看推送记录11.1、关于…

六. 部署分类器-trt-engine-explorer

目录 前言0. 简述1. 案例运行2. 补充说明3. engine分析结语下载链接参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习课程第六章—部署分类器&#xff0c;一起来学习 trt-engine…

Linux日志-secure日志

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux进阶部分又分了很多小的部分,我们刚讲完了Linux基础软件&#xff0c;下面是Linux日志。Linux 系统中的日志是记录系统活…

18041 分期还款(加强版)

### 自查思路 1. 检查输入数据的处理是否正确。 2. 检查判断条件 p < d * r 是否正确。 3. 确认公式计算和输出格式是否正确。 ### 伪代码 1. 读取输入的贷款金额、每月还款额和月利率。 2. 判断是否可以还清贷款&#xff1a; - 如果每月还款额小于贷款金额乘以月利率&a…

深度学习与大模型第2课:机器学习实战

文章目录 深度学习与大模型第2课&#xff1a;机器学习实战1. Iris鸢尾花数据集分类1.1 数据预处理1.2 模型训练与评估 2. 美国加州房价预测2.1 数据预处理2.2 模型训练与调优 3. 房价数据的回归分析3.1 数据预处理与建模 4. 时尚衣物识别:MNIST 数据集分类4.1 数据读取与可视化…

跑Boundary-Aware Feature Propagation遇到的问题

跑Boundary-Aware Feature Propagation遇到的坑 1、运行不报错&#xff0c;也不显示结果 从train.py代码第一行import开始添加&#xff0c;print&#xff08;“check1”&#xff09;&#xff0c;发现问题torch.encoding无法导入&#xff0c;反复地参考github源代码https://gith…

Axure RP9安装教程(Pro版)

[Axure RP 9.0下载链接]: https://ga90eobypbb.feishu.cn/docx/WKvldvZkMoKPnIx3Yl2cJhOBnqe 1.找到下载好的安装包&#xff0c;右键解压到“Axure RP 9.0”文件夹 2.双击打开解压出来的文件夹&#xff0c;选中”AxureRP-安装程序.exe“右键以管理员身份运行 3.点击"Nex…

测试小白入门-03测试理论知识看这一篇就够了

文章目录 前言一、软件开发过程模型瀑布开发模型&#xff08;熟悉&#xff09;快速原型模型&#xff08;理解&#xff09;螺旋模型(了解) 二、测试模型测试V模型&#xff08;代表性&#xff09;测试W模型&#xff08;中大型企业&#xff09;测试H模型&#xff08;了解&#xff…

38集 ESP32 离线刷机教程

38集 ESP32 离线刷机教程 打开离线刷机工具 e:\technology\ESP32\esp32s3Qorvo\esp32-s3_rtc\ESP离线刷机\flash_download_tool_3.9.7_1\flash_download_tool_3.9.7\flash_download_tool_3.9.7.exe 设置如下&#xff1a; 要知道如何设置&#xff0c;需要知道esp32s3 工程的me…

【C++ Primer Plus习题】8.5

问题: 解答: #include <iostream> using namespace std;template <typename T> T max5(T arr[5]) {T max 0;for (int i 0; i < 5; i){if (arr[i] > max){max arr[i];}}return max; }int main() {int max 0;double max1 0.0;int a1[5] { 21,34,12,42,9…

【综合小项目】—— 爬取数据、数据处理、建立模型训练、自定义数据进行测试

文章目录 一、项目内容二、各步骤的代码实现1、爬取数据2、数据处理3、建立模型训练4、自定义数据进行预测 一、项目内容 1、爬取数据 本次项目的数据是某购物平台中某个产品的优质评价内容和差评内容采用爬虫的 selenium 方法进行爬取数据内容&#xff0c;并将爬取的内容分别…

C_11_位段,共同体,枚举

位段 位段也称 位域 ​ 1 字节 8 位域 概述&#xff1a; 特殊的结构体 大小按位分配 示例1&#xff1a; struct packed_data {unsigned int a : 2; // 占2 位unsigned int a : 4; // 占4 位unsigned int a : 6; // 占6 位unsigned int i; // 占4字节 32位 1b8位 } data…

打字练习神器与基础打字指法

先奉上链接&#xff1a;Learn Touch Typing Free - TypingClub 最近观察到一位计算机的学长打字哒哒哒哒停不下来&#xff0c;研究了一下发现是自己的指法有问题&#xff0c;只能从头开始学起啦。如果刚学打字的朋友们一定要学习指法&#xff0c;打好基础&#xff01; 基础指法…

基于微信小程序的挂号管理系统-小程序端

微信小程序端系统功能实现 登录功能 系统登录功能中&#xff0c;用户只需在登录界面输入正确的用户名和密码&#xff0c;即可快速进入系统。登录功能还采用了先进的加密技术&#xff0c;保障用户信息的安全性&#xff0c;让用户能够放心使用。 注册功能 系统注册功中&#xf…

js数据类型转换-----统一转成字符串String()

String&#xff08;&#xff09; 所有类型都可以转成字符串 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"…

告别无序 10款科研项目管理工具为您的科研之路加速

国内外主流的10 款科研单位科研项目管理系统对比&#xff1a;PingCode、Worktile、Wizard、ShowDoc、Asana、ClickUp、Notion、Wrike、Basecamp、智方科研管理系统。 在选择科研项目管理系统时&#xff0c;许多科研单位都面临着如何找到能够真正满足特定需求的系统这一挑战。市…

HALCON 深度学习异常检测实例

首先你需要下载软件&#xff0c;halcon 20的版本和 Deep Learning Tool 工具 注意了&#xff0c;下载的halcon 必须要专业版的电脑系统&#xff0c;win10或者win11 都可以但是版本必须是专业版的不能是家庭版的 详情可看我另一篇文章 halcon 深度学习软件工具安装以及用法…

《高等代数》行(列)和相等行列式

说明&#xff1a;此文章用于本人复习巩固&#xff0c;如果也能帮助到大家那就更加有意义了。 注&#xff1a;1&#xff09;行&#xff08;列&#xff09;和相等行列式的求解方法是将其于行都加到第一行&#xff08;列&#xff09;&#xff0c;然后再提取第一行 …

Xilinx系ZYNQ学习笔记(一)Vivado使用说明

系列文章目录 文章目录 系列文章目录前言启示界面介绍新建工程主界面RTL分析与描述设计与综合引脚分配约束设计实现比特流文件的下载固化程序 添加源文件 前言 最近买了块xilinx的FPGA进行学习 启示界面介绍 新建工程 主界面 鼠标放在选项上时会出现中文翻译 RTL分析与描述…