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

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、

 

 

 

 

END

 

你可能感兴趣的:(java)