前言 最近看了极客时间的《Java业务开发常见错误100例》,再结合平时踩的一些代码坑,写写总结,希望对大家有帮助,感谢阅读~ 1. 六类典型空指针问题 包装类型的空指针问题 级联调用的空指针问题 Equals方法左边的空指针问题 ConcurrentHashMap 这样的容器不支持 Key 和 Value 为 null。 集合,数组直接获取元素 对象直接获取属性 1.1包装类型的空指针问题 public class NullPointTest { public static void main(String[] args) throws InterruptedException { System.out.println(testInteger(null)); } private static Integer testInteger(Integer i) { return i + 1; //包装类型,传参可能为null,直接计算,则会导致空指针问题 } } 1.2 级联调用的空指针问题 public class NullPointTest { public static void main(String[] args) { //fruitService.getAppleService() 可能为空,会导致空指针问题 fruitService.getAppleService().getWeight().equals("OK"); } } 1.3 Equals方法左边的空指针问题 public class NullPointTest { public static void main(String[] args) { String s = null; if (s.equals("666")) { //s可能为空,会导致空指针问题 System.out.println("公众号:捡田螺的小男孩,666"); } } } 1.4 ConcurrentHashMap 这样的容器不支持 Key,Value 为 null。 public class NullPointTest { public static void main(String[] args) { Map map = new ConcurrentHashMap<>(); String key = null; String value = null; map.put(key, value); } } 1.5 集合,数组直接获取元素 public class NullPointTest { public static void main(String[] args) { int [] array=null; List list = null; System.out.println(array[0]); //空指针异常 System.out.println(list.get(0)); //空指针一场 } } 1.6 对象直接获取属性 public class NullPointTest { public static void main(String[] args) { User user=null; System.out.println(user.getAge()); //空指针异常 } } 2. 日期YYYY格式设置的坑 日常开发,经常需要对日期格式化,但是呢,年份设置为YYYY大写的时候,是有坑的哦。 反例: Calendar calendar = Calendar.getInstance(); calendar.set(2019, Calendar.DECEMBER, 31); Date testDate = calendar.getTime(); SimpleDateFormat dtf = new SimpleDateFormat("YYYY-MM-dd"); System.out.println("2019-12-31 转 YYYY-MM-dd 格式后 " + dtf.format(testDate)); 运行结果: 2019-12-31 转 YYYY-MM-dd 格式后 2020-12-31 「解析:」 为什么明明是2019年12月31号,就转了一下格式,就变成了2020年12月31号了?因为YYYY是基于周来计算年的,它指向当天所在周属于的年份,一周从周日开始算起,周六结束,只要本周跨年,那么这一周就算下一年的了。正确姿势是使用yyyy格式。 正例: Calendar calendar = Calendar.getInstance(); calendar.set(2019, Calendar.DECEMBER, 31); Date testDate = calendar.getTime(); SimpleDateFormat dtf = new SimpleDateFormat("yyyy-MM-dd"); System.out.println("2019-12-31 转 yyyy-MM-dd 格式后 " + dtf.format(testDate)); 3.金额数值计算精度的坑 看下这个浮点数计算的例子吧: public class DoubleTest { public static void main(String[] args) { System.out.println(0.1+0.2); System.out.println(1.0-0.8); System.out.println(4.015*100); System.out.println(123.3/100); double amount1 = 3.15; double amount2 = 2.10; if (amount1 - amount2 == 1.05){ System.out.println("OK"); } } } 运行结果: 0.30000000000000004 0.19999999999999996 401.49999999999994 1.2329999999999999 可以发现,结算结果跟我们预期不一致,其实是因为计算机是以二进制存储数值的,对于浮点数也是。对于计算机而言,0.1无法精确表达,这就是为什么浮点数会导致精确度缺失的。因此,「金额计算,一般都是用BigDecimal…