1.Arrays.asList
业务开发当中,我们常常会将原始的数组转换为List类数据结构,来继续展开各种Stream操作
Arrays.asList无法转换基本类型的数组,可以使用Arrays.stream来进行转换Arrays.asList返回的list是不支持增删操作的,其返回的List是Arrays的内部类ArrayList。内部继承自AbstractList,没有覆写父类的add方法对原始数组的修改会影响到我们获得的那个ListArrayList实际上是使用了原始的数组,因此在使用的时候,最好再使用NewArrayList来实现解耦2.空值处理2.1NullPointerException可能出现的场景
参数值是Integer等包装类型,使用时因为自动拆箱出现了空指针异常字符串比较ConcurrentHashMap这种容器不支持Key和Value为null,强行putnull的key或Value会出现空指针异常方法或远程服务返回的list是null,没做判空就直接调用,出现空指针异常联级调用的nullcheckbestpractice
string.equalsTo(variableName)Optional.ofNullable()orElse()3.异常处理3.1在业务代码层面考虑异常处理大多数业务应用都采用三层架构负责数据访问实现,一般没有业务逻辑根据情况来做忽略,降级,或者转化为一个友好的异常负责核心业务逻辑,包括外部服务调用,访问数据库,缓存处理,消息处理等一般会涉及到数据库事务,出现异常不适合捕获,否则事务无法自动回滚负责信息收集,参数校验,转换服务层处理的数据适配前端,轻业务逻辑Controller捕获异常,然后需要给用户友好用户的提示Controller层Service层Repository层框架层面的异常处理RestControllerAdviceExceptionHandler尽量不要在框架层面做异常的自动,统一的处理框架应当来做兜底工作,如果异常上升到最上层逻辑还是无法处理的话,可以用统一的方式进行异常转换3.2不要直接生吞异常捕获了异常以后不应该生吞,因为吞掉的异常如果没有正常处理的话,出现Bug会很难发现。
需要有合适的转化成用户友好的异常,或者至少在warn,error级别来做log。
3.3保留原始的信息在捕捉了异常之后,一定要记得在log或者在向外扔出的异常之中记录原始异常信息
catch(IOExceptione){//只保留了异常消息,栈没有记录log.error("文件读取错误,{}",e.getMessage());thrownewRuntimeException("系统忙请稍后再试");}catch(IOExceptione){thrownewRuntimeException("系统忙请稍后再试",e);}3.4小心finally中的异常+trywithresources注意在资源释放处理等收尾操作的时候也可能会出现异常,这种时候,如果tryblock逻辑和finnally逻辑都有异常抛出的话,try当中的异常会被finnally中的异常覆盖掉,这会让问题变得非常不明显。
GetMapping("wrong")publicvoidwrong(){try{log.info("try");//异常丢失thrownewRuntimeException("try");}finally{log.info("finally");thrownewRuntimeException("finally");}}对于实现了AutoCloseable接口的资源,可以使用try-with-resources来释放资源,就是在try中带资源的声明。
trycatchfinallyvstrywithresources
Scannerscanner=null;try{scanner=newScanner(newFile("test.txt"));while(scanner.hasNext()){System.out.println(scanner.nextLine());}}catch(FileNotFoundExceptione){e.printStackTrace();}finally{if(scanner!=null){scanner.close();}}try(Scannerscanner=newScanner(newFile("test.txt"))){while(scanner.hasNext()){System.out.println(scanner.nextLine());}}catch(FileNotFoundExceptionfnfe){fnfe.printStackTrace();}3.5线程池任务的异常处理设置自定义的异常处理程序作为保底,比如在声明线程池时自定义线程池的未捕获异常处理程序:
newThreadFactoryBuilder().setNameFormat(prefix+"%d").setUncaughtExceptionHandler((thread,throwable)-log.error("ThreadPool{}gotexception",thread,throwable)).get()Reference
专注于深圳互联网的好机会
深圳市拜特科技股份有限公司
深圳市拜特科技股份有限公司成立于年,年在新三板正式挂牌上市。、连续两年被工信部授予中国金融科技产业领*企业称号。是一家集资金管理信息化系统建设开发、互联网金融平台、供应链金融服务多位一体的综合性国家高新技术企业。面向企业集团、财务公司、银行及*府机构提供资金管理咨询、软件开发、投资理财、以及系统集成在内的整体解决方案和服务。
公司总部位于深圳,并成立了以北京、深圳、上海为中心的华北、华南、华东三大运营中心,在天津、河北、山东、陕西、河南、浙江、江苏、湖北、湖南、福建、云南、广西、宁夏等各地设有十几家分支机构,服务网络遍及全国。
1
JAVA软件工程师(项目开发)
要求经验:1-3年
要求学历:本科及以上学历
招聘人数:1人
薪酬:8k-16k
工作地点:
深圳市南山区科苑路15号科兴科学园一期A1栋16楼
技能要求:
SQL,MySQL,Java
任职资格:
1.本科以上学历;
2.1-3年及以上面向对象软件分析、设计经验,精通面向对象思想。熟悉JVM(内存模型,垃圾回收机制等),熟悉设计模式,有带领团队经验,优先考虑;
3.精通Java及其主流设计架构、精通Struts、spring、Hibernate等常用开源框架,精通jsp及常用标签库,精通常用的webservice,定时任务技术。熟悉Linux操作系统,优先考虑;
4.熟悉xml、json等常用数据格式,熟悉