很多Java初学者在开始编程的时候都会遇到一些问题。这些问题不是指某个特定领域的问题,也不是指某个业务的问题,不是不熟悉导致的问题,而是对基础知识不够熟悉导致的问题。正是这些问题导致我们编写了一些不太健壮的代码。本文将列出编程初学者经常遇到的几个问题。相信这些问题现在或过去都或多或少困扰过您。如果觉得文章不错,不妨点个赞分享一下,让更多的人在开发中跳过这些坑。无处不在的Null值我见过很多返回Null值作为返回值的代码。当你期望一个字符串时,你不小心得到了一个Null值;当你期待一个List时,你不小心得到了一个Null值,如果你不处理它,那么你会不小心得到NullPointerException。像下面这样。//case1StringuserTag=getUserTag();if(userTag.equals("admin")){//NullPointerException//...}//case2ListcarList=getCarList();for(Stringcar:carList){//NullPointerException//...}为了防止这种情况,可以在返回List的时候给一个空集合,而不是Null,如果是字符串,可以把待判断的值对象放在前面比较。if("admin".equals(userTag)){//...}//orif(Objects.equals(userTag,"admin")){//...}可以考虑不做空检查上面的Null值的情况,但是实际处理时不考虑空值的情况,比如字符空串空串“”,或者集合为空。那么在后续的处理过程中就有可能得到一个NullPointerException。所以你应该做一个空值判断。StringuserTag=getUserTag();if(userTag!=null&&userTag.trim()!=""){//...}ListcarList=getCarList();if(carList!=null&&!carList.isEmpty()){//...}IgnoredExceptionHandling异常处理总是令人厌烦,而忽略异常似乎总有一种诱人的魅力。我看过如下代码。try{Listresult=request();//...}catch(Exceptione){}你没有看错,catch里面什么都没有,然后就出问题了,看日志文件,有是无影无踪。异常是故意抛出的,你应该妥善处理它们或继续抛出。并且同时输出一行日志来记录这个异常,方便以后的问题跟踪。在不释放资源的情况下读取文件或请求网络资源时始终执行关闭操作非常重要,否则可能会阻塞其他线程的使用。但是初学者可能会忘记这一步。其实从Java7开始就提供了try-with-resources自动关闭资源的特性,只需要将打开的资源放入try即可。try(FileReaderfileReader=newFileReader("setting.xml")){//fileReader.read();//...}catch(Exceptione){e.printStackTrace();}同上,无需手动在finally中调用fileReader的close方法关闭资源,因为放在try中的资源调用在使用时会自动调用close。而且无论是否抛出异常都非常实用。ConcuretModificationException有一天你会遇到ConcuretModificationException,然后开始百度搜索它的解决方案。这种异常最常见的场景是你在遍历一个集合的时候执行更新操作,比如下面这样。Listlist=newArrayList<>();list.add("a1");list.add("b1");list.add("b2");list.add("c1");for(Strings:list){if("b1".equals(s)){list.remove(s);}}这个异常非常有用,因为ArrayList不是线程安全的集合,假设你是在一侧遍历,另一个线程不断更新,非线程安全的集合会导致你的遍历结果不正确,所以这个异常的存在是合理的。同理,HashMap也没有注解。准确的注解可以救人于水火,这有时并不为过。虽然说优秀的代码本身就是很好的注释,但是在实际开发中,这种情况很少发生。注释并不要求你把所有的事情都详细记录下来,但是你应该对核心逻辑添加应有的注释,比如复杂逻辑的实现,当前逻辑的业务需求。加入某种判断的原因,某种异常的发生等等。如果将来某天需要回顾当前代码,这可以让您感谢自己。它还可以让您在某一天的投壶中轻松获胜。没有代码测试我看到有的同事开发完功能直接扔给对接的同事,但是我没有通过任何测试,或者我只是测试了一个简单的情况。测试是开发过程的重要组成部分。没有经过严格测试的代码很难说没有问题。我觉得功能开发出来后至少需要进行单元测试、特殊用例测试、集成测试等形式的测试。严格的测试不仅可以在第一时间发现问题,还可以减少后期不必要的对接和调试时间。众所周知,Java社区非常活跃,有大量的第三方库。开源作者可能花费数年时间维护和改进这些库。这些图书馆很棒。同时JDK还提供了大量常用的功能包。这些都可以为我们的开发速度插上翅膀。因此,当你需要一个功能时,首先应该检查JDK和导入的类库中是否已经存在相同的功能,而不是自己重新造轮子,而大多数情况下你造的轮子不如别人造的轮子。这里有些例子。如果需要日志记录,可以使用logback。如果需要网络操作,可以使用netty。如果需要解析JSON,可以使用gson。如果需要解析表,可以使用apachepoi。如果需要通用操作,可以使用apachecommons。情况是你可能不知道JDK中已经实现了某个功能。这时候就应该多查看JDKDocument。看到同事在工??作中手写字符串拆分,为了获取时间戳,将Date对象转为Calendar。缺乏必要的沟通与开发无关,但这个环节往往会影响最终的开发结果。在进行具体开发之前,应该详细沟通了解功能需求,这样才能根据具体需求编写出不脱离实际需求的代码。有时你可能会因为缺乏必要的沟通而误解需求,最后开发完成后发现自己写的功能完全没用。没有代码规范代码规范很重要。如果一个项目中充斥着各种稀奇古怪的代码规范,会让维护者头疼不已。而且,随着软件行业的快速发展,对开发人员综合素质的要求也越来越高。优秀的编程习惯还可以提高软件的最终质量。例如:标新立异的命名风格挑战阅读习惯;各种错误码人为增加排查难度;工程结构混乱,后续工程维护困难;未经认证的易受攻击代码容易被黑客攻击;低质量的代码上线后漏洞百出等等,因为没有统一的代码规范,开发中的问题可能层出不穷。以下简要列出应统一的开发规范。例如,什么是最好的命名风格;什么是常量名称结构;如何统一代码格式;如何处理日期和时间格式;藏品加工注意事项;上述开发规范代码规范推荐阿里推出的《Java 开发手册》,详细列出了Java开发各个环节应遵循的规范规范。总结Bug和技术上的误解是美丽的谜团,我们SherlockHolmes最终会解开。命运掌握在自己手中,每一次探索这些技术误区,都会增加我们对开发编码的理解。随心所欲,多彩就是乐趣,体验就是生活,不管是各种技术,还是各种问题,我都想看。作者:图灵程序员链接:https://juejin.im/post/6867759801380634632来源:掘金版权归作者所有。商业转载请联系作者授权,非商业转载请注明出处。