Java-遇到的bug记录

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云解析 DNS,旗舰版 1个月
简介: Java-遇到的bug记录

1、HTTP请求返回415错误码

   调用接口时候,返回了415错误码,说明

415 Unsupported Media Type 服务器无法处理请求附带的媒体格式

这么一看,就想到了,请求头中的Content-Type,那边接口文档给的是传入JSON,我是传了个JSON形式的字符串,看来不可以。

好吧,我搞一下:

// 设置请求header
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
JSONObject jo = JSONObject.parseObject("jsonStr");
// 请求体,包括请求数据 body 和 请求头 headers
HttpEntity httpEntity = new HttpEntity(jo,headers);
发送。。。

image.gif

ok

2、Java调用接口时候,发现URL中或者报文中,有一些特殊字符是不可以直接写,有时候就自动转换十六进制了

URL特殊符号及编码

特殊符号    描述    十六进制值

+    URL 中+号表示空格    %2B

空格    URL中的空格可以用+号或者编码    %20

/    分隔目录和子目录    %2F

?    分隔实际的 URL 和参数    %3F

%    指定特殊字符    %25

#    表示书签    %23

&    URL 中指定的参数间的分隔符    %26

=    URL 中指定参数的值    %3D

解决方法:URLEncoder.encode(url,"utf-8");

这玩意还要深深的细细研究下

3、des解密时,报错 :Input length must be multiple of 8 when decrypting with padded cipher

这个错误七十四就是解密失败,检查以下情况:

传入的是不是已加密的,密钥对不对,传输过程中url和报文是否出现上述2中 / 、 + 之类特殊字符的情况

解决:将url转换成安全的Base64编码:

Base64 base64 = new Base64(true)encodeAsString(str);

image.gif

注意:网上说在用json字符串加密的过程用DES加密多了“\r\n”,在接收的时候被转义了,解密的时候也出现了 Input length must be multiple of 8 。我没遇到这个。。。

反正就是转义的问题/。。。。

ok

4、在使用mysql的decimal的时候,在Java中使用BigDecimal映射字段后,插入的一直是整数的问题

解决:DBA创建的数据库中decimal(20,0),应该是decimal(20,4)这样,坑

ok

5、出现 java.net.UnknowHostException: XXX.XXX.XXX 异常的原因及解决方法

这是说:未知主机异常。调用别人接口时候看到的,原因是内网渗透映射的那种路由没能解析成IP,然后网关还是防火墙啥的也没设置好,所以通不了。本质上还是域名解析不了。

解决:应该在host文件中映射 这个XXX.XXX.XXX 及对应的ip,能保证成功解析为ip,就OK!

6、405错误码

访问的方式不对,比如定义了必须POST请求,却使用get访问,就会报这个。

7、java.io.EOFException。   其实只是一个消息通知,目前已读取的流就是全部了

这是一个IO异常的子类,名字也是END OF FILE的缩写,当然也表示流的末尾

它在表明一个信息,流已经到末尾了,而大部分做法是以特殊值的形式返回给我们,而不是抛异常

如果在while循环中去readUTF() ,本质上是没有问题的,有数据来就会读,没有就自动阻塞。那么抛出EOFException一定是因为连接断了还在继续read,什么原因导致连接断了呢?一定是业务逻辑哪里存在错误,比如NullPoint、 ClassCaseException、ArrayOutofBound,即使程序较大也没关系,最多只要单步调适一次就能很快发现bug并且解决它。

如果你是第一种,你客户端已经被你断开,你可以捕捉这个客户端断开的异常EOFExcption,然后做你需要的处理,try ... catch(EOFException){ System.out.println("这是合法的,客户端已经关闭");}

用到了socket的话,你的客户端每次在传输完你的数据后,再传输一个null过去,就行了。不然就报EOF异常。

8、socket is closed异常

该异常在客户端和服务器均可能发生。异常的原因是己方主动关闭了连接后(调用了Socket的close方法)再对网络连接进行读写操作。每次通过socket发送data都可以或是每次只接受也可以。但是 接收 和 发送放在一起就会出现 socket closed 的错误,是因为socket 只要在 io流close的情况下自动关闭,意思就是你想边发送边接受最正确的方式就是发送和 接受的操作都做完之后 再一起关闭IO流,而且还要研究下那个closeable接口,Socket1.8后实现了该接口了。。。

9、浏览器控制台发现出现 in a frame because it set 'X-Frame-Options' to 'DENY'

该异常在Springboot集成security 的时候出现的,原因是默认设置了X-Frame-Options为 'DENY',springSecurty使用X-Frame-Options防止网页被Frame。这里X-Frame-Options有几个参数:

DENY:浏览器拒绝当前页面加载任何Frame页面

SAMEORIGIN:frame页面的地址只能为同源域名下的页面

ALLOW-FROM:origin为允许frame加载的页面地址。

解决:添加:http.headers().frameOptions().disable();反正就是要去掉这个设置,或者请求头舍

image.png

image.gif编辑

编辑

10、java.lang.NoClassDefFoundError: org/apache/commons/compress/utils/InputStreamStatistics

这个错误是在找不到匹配的类的时候出现的。要解决就找对应的包就好。

查看了 Apache compress的版本对比才发现 InputStreamStatistics 是在1.17后才提供的,而在项目中,我已经导入了1.9,所以只需要提高到1.17以后版本就好了,这个依赖包是 使用POI解析Excel时使用到的。

11、Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4:tes

src->test->java下有测试文件出错,删掉就可以了。

12、The maximum number of tolerable server reconnection errors has been reached

没有读取到bootstrap.扩展名配置内容。springcloud的配置需要优先加载bootstrap.扩展名

13、eclipse升级到2020-06的4.16.0后,集成了sts3,会出现了一个问题:SpringBoot项目run as 只有作为application运行,而没有作为SpringBoot APP运行,换成sts4后,问题解决。

14、安装 lombok插件后,需要clean下project 才会去掉报错。

15、Cannot resolve org.openjfx:javafx.base:11.0.0-SNAPSHOT

     Cannot resolve org.openjfx:javafx.base:11.0.0-SNAPSHOT_CQTany的博客-CSDN博客

16、Image IO .read()读取gif图片流会出现 ArrOutIndex异常

   JDK6到8的历史问题,升级版本就好,或者改用其它方式实现。

17、@RequestParam(value = "file") MultipartFile[] files 后台接收不到多个图片流

   前端传输单张图片流用MultipartFile没问题,但是多个就会报错,原因是前端的多个图片name必须全部为 file,使用formData对象提交必须也是 append到file,保持name一致。

18、413 Request Entity Too Large(请求实体太大)

看到请求的body的大小,在Content-Length后显示,Nginx默认的request body为1M,小于我们上传的大小

解决方案

找到自己主机的nginx.conf配置文件,打开

在http{}中加入 client_max_body_size 10m;

然后重启nginx

/etc/init.d/nginx restart

19.idea使用Lombok

pom引入

settings

下载插件、build,exection里 打开 enable annotion processing

20.redis连接失败报错 org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis;

redis属性protected-mode配置引起;

       当protected-mode保护模式关闭时,外部网络可以直接访问;

       当protected-mode保护模式开启时,需配置bind ip或者设置访问密码才可以访问;

解决:

1.将redis配置文件中的protected-mode yes 改为protected-mode no

2.将redis配置bind ip或者设置访问密码

21.浅析JAVA中VO、DTO、DO、PO的了解

   VO全称ViewObject,我们把它看作视图目标,用于展现层,它的作用是把某个指定页面一切数据封装起来。

  DTO全称DataTransferObject,数据传输目标,它的作用是展现层(前端页面)与服务层(后端服务接口)之间的数据传输目标。

  DO全称DomainObject,领域目标,就是从实际国际中笼统出来的有形或无形的业务实体(我们把用户的基本信息笼统成一个USER目标,有年纪,性别,出生日期等特点)。

  PO全称PersistentObject,耐久化目标,它跟耐久层(通常是联系型数据库如mysql,oracle等)的数据结构形成一一对应的映射联系,如果耐久层(mybatis,hibernate,jpa等)是联系型数据库,那么,数据表中的每个字段就对应PO的一个特点。

22.HTTP 302响应码

2xx - 成功 这类状态代码表明服务器成功地接受了客户端请求。

200 - 确定。客户端请求已成功。

301 - 目标永久性转移

302 - 目标暂时性转移

302重定向又称之为302代表暂时性转移(Temporarily Moved ),英文名称:302 redirect。 也被认为是 暂时重定向(temporary redirect),一条对网站浏览器的指令来显示浏览器被要求显示的不同的URL,当一个网页经历过短期的URL的变化时使用。一个 暂时重定向是一种服务器端的重定向,能够被 搜索引擎蜘蛛正确地处理。

23.报错 - invalid LOC header (bad signature)的解决办法

把本地仓库中相应的jar包删除或者重命名,重新运行该项目即可

24.报错 - Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.18.1:test (default-test) on project print-common: There are test failures.

忽略测试

<build>

       <plugins>

           <!--添加配置跳过测试-->

           <plugin>

               <groupId>org.apache.maven.plugins</groupId>

               <artifactId>maven-surefire-plugin</artifactId>

               <version>2.22.1</version>

               <configuration>

                   <skipTests>true</skipTests>

               </configuration>

           </plugin>

           <!--添加配置跳过测试-->

       </plugins>

   </build>

25.查看80端口占用情况     netstat -ano | findstr ":8080 "

查看20268所对应的服务名称    tasklist /fi "PID eq 20268"

26.注意

对 于 Integer var = ? 在 -128 ⾄ 127 之 间 的 赋 值 , Integer 对 象 是 在

IntegerCache.cache 产 ⽣ , 会复⽤已有对象,这个区间内的 Integer 值可以直接使⽤==进⾏

判断,但是这个区间之外的所有数据,都会在堆上产⽣,并不会复⽤已有对象,这是⼀个⼤坑,推荐使⽤ equals ⽅法进⾏判断。

27.eclipse Failed to load JavaHL Library.

svn接口由 javaHL 改为 svnkit即可

28.断点失效:Eclipse Unable to install breakpoint in XXX 解决办法

项目工程名 ,右键 --》 properties --》 java compiler --》class file Generation 位置  Add line number attributes to generated class files   打钩 -->apply

然后最好clean 一下;网上大都是 在windows -- Preferences - Java - Complier --》class file Generation 位置  Add line number attributes to generated class files  ;最好2个地方都 勾上 。

错误根源就是断点打到注释上了,菜单栏Run>Remove All Breakpoints完美解决

29.@ModelAttribute标注可被应用在方法或方法参数上。

标注在方法上的@ModelAttribute说明方法是用于添加一个或多个属性到model上。这样的方法能接受与@RequestMapping标注相同的参数类型,只不过不能直接被映射到具体的请求上。

在同一个控制器中,标注了@ModelAttribute的方法实际上会在@RequestMapping方法之前被调用。

@ModelAttribute方法通常被用来填充一些公共需要的属性或数据,比如一个下拉列表所预设的几种状态,或者宠物的几种类型,或者去取得一个HTML表单渲染所需要的命令对象,比如Account等。

@ModelAttribute标注方法有两种风格:

在第一种写法中,方法通过返回值的方式默认地将添加一个属性;

在第二种写法中,方法接收一个Model对象,然后可以向其中添加任意数量的属性。

30.Eclipse中设置作者日期等Java注释模板

设置注释模板的步骤:点击菜单栏上的Window -->Preferences-->Java-->Code Style -->Code Templates,对右侧Comments选项中具体的注释信息进行编辑即可。可勾选上自动添加注释信息,在生成java文件时便会自动生成注释,当然也可以手动插入注释。

31.transient只能用来修饰成员变量(field),被transient修饰的成员变量不参与序列化过程。

32.@Value和@ConfigurationProperties之间的区别。

33.maven中的 dependencies 和 dependencyManagement 的区别

maven 使用dependencymanagement 元素来提供了一种管理依赖版本号的方式。通常会在一个组织或者项目的最顶层的父pom

中看到dependencymanagement 元素。使用pom.xml 中的dependencymanagement 元素能让

所有在子项目中引用一个依赖而不用显式的列出版本号。maven 会沿着父子层次向上走,直到找到一个拥有dependencymanagement 元素的项目,然后它就会使用在这个dependencymanagement 元素中指定的版本号。

dependencymanagement里只是声明依赖,并不实现引入,因此子项目需要显式的声明需要用的依赖。所以它只是对版本进行管理,不会实际引入jar。

dependencies相对于dependencymanagement,所有声明在dependencies里的依赖都会自动引入,并默认被所有的子项目继承。

比如我们在项目中需要引入一个框架A的jar包:a.jar。而A框架的作者为了实现A框架又在其pom里面引入了spring框架,那么问题就来了,如果我们的项目也要用到spring框架,那spring框架的版本应该以谁的为准呢?

这可能就是dependencyManagement的作用了,你可以在dependencyManagement中对spring进行版本声明,然后你在dependencies中添加对A框架的引用,那么实际引入的spring版本就是你在dependencyManagement中声明的版本了。

34.mvn dependency:tree命令显示项目依赖关系的树形表示。

35 精度丢失问题

public static void main(String[] args) {

       Double a = 0.3;

       Double b = 0.1;

       System.out.println(a-b);

       Double a2 = 0.3*10;

       Double b2 = 0.1*10;

       System.out.println((a2-b2)/10);

       

       Double a1 = 3.0;

       Double b1 = 1.0;

       System.out.println(a1-b1);

   }

36.关于idea编译时提示 : 另一个程序正在使用此文件,进程无法访问; 问题修复记录

https://blog.csdn.net/bayer_zeng/article/details/102682379

37.Intellij IDEA运行报Command line is too long的解决办法

解决方案(1): 找到项目下的.idea/workspace.xml,在标签<component name="PropertiesComponent">里添加一行属性:<property name="dynamic.classpath" value="true" />

<component name="PropertiesComponent">

 其它属性不改

 <property name="dynamic.classpath" value="true" />

</component>

解决方案(2):

打开程序的运行配置,把Shorten command line改为JAR manifest或classpath file.

38.idea中Field injection is not recommended提示

在idea的设置中,使用属性值注入这个警告提示是可以在idea中取消的,但是为什么会有这个提示呢?这就不得不从依赖注入的3中方式说起了。

一,constructor构造器注入(特点:为了强制依赖,或者为了易变性);

二,getter & setter 方法注入(特点:为了可选的或者可变的依赖);

三,field属性注入也就是反射注入,@Autowired就是通过这种方式,这种方式是要尽量避免使用的,也就有了开头的提示信息。

一个类有超过10个的依赖,如果使用构造方法注入的话,构造方法会有10个参数是不是有点困扰呢??此时使用属性注入就很简洁。此时借用一句话来反击下就是:一个类有很多依赖是一个危险的标志(违背了单一职责原则!)

改成:

private final QueryBasicService queryBasicService;

   @Autowired

   public QueryBasicController(QueryBasicService queryBasicService){

       this.queryBasicService = queryBasicService;

   }

39.Spring 注解-@Qualifier

在使用Spring框架中@Autowired标签时默认情况下使用 @Autowired 注释进行自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个。当找不到一个匹配的 Bean 时,Spring 容器将抛出BeanCreationException 异常,并指出必须至少拥有一个匹配的 Bean。

Spring 允许我们通过 @Qualifier 注释指定注入 Bean 的名称,这样歧义就消除了,可以通过下面的方法解决异常。

@Qualifier("XXX") 中的 XX是 Bean 的名称,所以 @Autowired 和 @Qualifier 结合使用时,自动注入的策略就从 byType 转变成 byName 了。

@Autowired 可以对成员变量、方法以及构造函数进行注释,而 @Qualifier 的标注对象是成员变量、方法入参、构造函数入参。

END

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
7月前
|
分布式计算 DataWorks Java
DataWorks操作报错合集之在使用MaxCompute的Java SDK创建函数时,出现找不到文件资源的情况,是BUG吗
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
92 0
|
Cloud Native Java Go
那些年,我们追过的Java BUG
那些年,我们追过的Java BUG
139 0
|
算法 搜索推荐 Java
Java8 到 Java17 升级指南(Bug大全)
Java8 到 Java17 升级指南(Bug大全)
542 0
Java Exception异常信息怎么打印、记录,几种方式自己选
Java Exception异常信息怎么打印、记录,几种方式自己选
684 0
Java Exception异常信息怎么打印、记录,几种方式自己选
|
4月前
|
IDE Java 测试技术
如何优雅地根治Java中Null值引起的Bug问题
【8月更文挑战第18天】在Java开发中,null 值是一个既常见又危险的存在。它常常是导致程序崩溃、难以调试的“罪魁祸首”。然而,通过一系列优雅的策略和实践,我们可以有效地减少甚至根除由 null 值引发的Bug。本文将从多个方面探讨如何做到这一点。
87 4
|
6月前
|
存储 SQL 关系型数据库
【BUG记录】Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x90\xA6' for column 'name' at row 1
在MySQL中遇到`Incorrect string value`错误通常是因为尝试插入的字符串包含不被数据库字符集支持的字符,如表情符号。错误根源是MySQL默认的utf8不支持4字节的UTF-8字符(如Emoji)。
603 1
|
7月前
|
Java Maven
[Java ] jdk升级 bug java: -source 8 中不支持 instanceof 中的模式匹配 (请使用 -source 16 或更高版本以启用 instanceof 中的模式匹配)
[Java ] jdk升级 bug java: -source 8 中不支持 instanceof 中的模式匹配 (请使用 -source 16 或更高版本以启用 instanceof 中的模式匹配)
462 0
|
SQL 前端开发 Java
JSP缺陷问题(bug)管理系统myeclipse开发sql数据库BS模式java编程MVC结构
JSP 缺陷问题(bug)管理系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库采用 serlvet dao bean MVC模式进行开发,系统主要采用B/S模式开发。
56 0
|
Java
java.util.ConcurrentModificationException【bug】
java.util.ConcurrentModificationException【bug】
61 0
|
Java API 容器
java项目排查bug
java项目排查bug
133 0