的线上问题,尤其是今年。记下几个惨痛的上网陷阱记录,希望大家能够以史为鉴。1.包装类型自动拆箱导致空指针异常publicintgetId(){Integerid=null;returnid;}如果调用上面的方法会发生什么?id是Integer类型,方法返回值是int类型,会自动拆箱转换。由于id为null,当转换为int类型时,会报NullPointerException。不管是《阿里Java开发手册》、《代码整洁之道》还是《Effective Java》,建议方法返回值类型写成包装类型,类似于Integer。另外,实体类中的属性、接收前端传参类、给前端的响应类都要写成封装类型,避免开箱错误。2.包装类型使用==判断相等,导致判断错误。首先看一段代码的运行结果:publicclassIntegerTest{publicstaticvoidmain(String[]args){Integera=100;整数b=100;整数c=200;整数d=200;System.out.println(a==b);//输出真System.out.println(c==d);//输出false}}很多人会很疑惑,为什么输出的两个结果会不一样呢?当给Integer类型赋值时,会调用Integer.valueOf()方法staticfinalintlow=-128;staticfinalinthigh=127;publicstaticIntegervalueOf(inti){if(i>=IntegerCache.low&&i<=IntegerCache.high)returnIntegerCache.cache[i+(-IntegerCache.low)];returnnewInteger(i);}当值在-128到127之间时,会重用缓存。当不在此范围内时,将创建该对象。而==比较的是内存地址,不同对象的内存地址是不一样的,所以出现了上面的结果。整数覆盖equals()方法:publicbooleanequals(Objectobj){if(objinstanceofInteger){returnvalue==((Integer)obj).intValue();}returnfalse;}使用equals()方法时,比较的是int值是否相等。所以,包装类判断是否相等时,一定不能用==来判断,必须用equals()方法来判断。3、传给Switch的参数为null,导致空指针异常。猜猜下面代码的运行结果:publicclassTest{publicstaticvoidmain(String[]args){Stringname=null;switch(name){case"yideng":System.out.println("一盏灯");休息;默认:System.out.println("默认");}}}是不是觉得会输出default,但是代码会抛出NullPointerException。switch比较两个对象是否相等时,会调用name.hashCode()方法和name.equals()方法,因为name为null,结果抛出NullPointerException。所以在调用switch方法之前,需要判断传入的参数为空。4.创建BigDecimal类型时精度丢失。猜猜下面代码的运行结果:publicclassTest{publicstaticvoidmain(String[]args){BigDecimalbigDecimal=newBigDecimal(0.1);System.out.println(bigDecimal);你以为它会输出0.1,结果输出结果是:0.1000000000000000055511151231257827021181583404541015625什么?这么一大串东西是什么?为什么会这样?原因是当我们使用newBigDecimal(0.1)创建对象时,会调用BigDecimal的构造方法:publicBigDecimal(doubleval){this(val,MathContext.UNLIMITED);}参数0.1被认为是一个double类型,double在计算的时候会把值转成二进制,0.1转成二进制是不可分割的,所以带了很多小数位。当我需要创建一个BigDecimal类型时应该怎么做?可以先将值转换成字符串类型,然后创建一个BigDecimal对象,像这样:BigDecimalbigDecimal=newBigDecimal(String.valueOf(0.1));还有一个问题,BigDecimal是怎么解决精度损失的问题的?答案是BigDecimal会先把值乘以10的整数倍,去掉小数位,转成long类型,再进行运算,最后将运算结果除以10的整数倍。5.分组时,主键重复,导致异常。下面代码的分组能否成功?publicclassSteamTest{staticclassUser{//用户IDprivateIntegerid;//用户名privateStringname;}publicstaticvoidmain(String[]args){List
