工作中的问题与解决(一)
程序员文章站
2022-07-12 21:27:42
...
接着上篇和上上篇,本来以为功能完成,顺利完成任务。没想到,周一一来上班就发现出了问题。
去线上查日志,发现不知道为啥乱码了,但是此时不能确定是日志本身打印出来就中文乱码,还是我的程序出了问题到底中文乱码。于是狂加日志,有的日志本身就带上中文。然后看显示的是否是乱码。后面发现是日志显示出来就是乱码。比如"file name 是",最后显示出来就是“file name is ?"
邮件中的乱码就这样
其实我后面发现我仔细想想,毕竟我的结果中的产品1,是可以正常显示的,所以并不是linux或者java本身有什么乱码问题,这种应该会导致所有的中文都乱码。只有title这个是乱码,所以很有可能原因来自这。但是我实在是太习惯于不停的试,却不怎么思考问题了。所以,等我一直尝试,一直慢慢去掉不可能的原因,才发现这个结果。
其实问题最终定位到是读写文件时编码问题。因为我发现,我写入txt的文件已经是乱码了。
所以最终通过设置文件流的读取和写入的编码为UTF-8,解决问题。
//读取内容
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
//写入文件
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file),"UTF-8"));
一开始这么写的读和写,并没有出现特别大的问题,但是后来也不能确定是因为什么原因就乱码了。
//读取内容
BufferedReader br = new BufferedReader(new FileReader(file));
//写入文件
FileWriter fw = new FileWriter(file);
BufferedWriter bw = new BufferedWriter(fw);
然后我的邮件之所以发不出来,就是因为这个乱码的原因,导致代码出了异常。
ERROR org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/].[dispatcherServlet]
- Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nest
ed exception is java.util.NoSuchElementException: No value present] with root cause
java.util.NoSuchElementException: No value present
at java.util.Optional.get(Optional.java:135) ~[?:1.8.0_131]
出这个错是因为我的代码是这么写的,我认为在voList的title一定会在this中已经存在过。但是发现因为乱码,申请单数和?????已经对不上了,所以出了问题。
ProductDetailVO vo = voList.stream().filter(a -> a.getTitle().equals(this.getTitle())).findFirst().get();
于是修改为否则就为null,要是null就直接返回。这个地方其实不应该为null,要是为null存在,则表示这代码前面的那些代码控制的不到位,不应该改这里,而应该改前面。
ProductDetailVO vo = voList.stream().filter(a -> a.getTitle().equals(this.getTitle())).findFirst().orElse(null);
if (vo == null) {
return this;
}
其实编码问题导致中文乱码,我遇到好多次了,每次都没有特别的头绪,只是模糊的知道编码乱码是因为编码和解码的使用的编码方式不一致导致的。但是具体就不了解了,好在我看了一篇博客:JAVA几种常见的编码格式(转),了解了不少,希望以后能少点这个问题了。上一篇: Appium 环境搭建