Java-遇到的bug记录

1、HTTP请求返回415错误码

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

415Unsupported 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);
发送。。。

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);

注意:网上说在用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();反正就是要去掉这个设置,或者请求头舍

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

      https://blog.csdn.net/weixin_44727906/article/details/106671201

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值