Java基础的一些问题
1、空指针异常的常见情况
a、方法返回的对象为null。
b、a为封装类,如果a对象为null,a再与基本数据类型比较时会出异常。
2、基本数据类型与其封装类的取舍
a、方法的参数的类型使用时,我通常是使用基本数据类型,这样方法内就不需要考虑参数为null的情况,特殊情况除外。
b、类中的属性,我通常是用的封装类,因为如果为基本数据类型,则属性就会有一个默认值,这种情况很难判断属性到底有没有赋值。
c、jdk1.5及以上版本,基本数据类型可以与封装类自由转换,但要注意封装类为null时,是无法转换为基本类型的。
3、JsonObject进行格式化时,对象的属性值明明为null, json字符串的值却为0、false等
JSON时有默认值,所以封装类的值为null是就会被转换为0、false等默认值。
4、Infinity 与 volatile
在Java除法中,允许浮点数运算时除数为0,所得结果为Infinity,是无穷大的意思。例如:double d = 5.1/0 ; 这里d的值就是Infinity。
volatile是一个类型修饰符(type specifier)。它是被设计用来修饰被不同线程访问和修改的变量。如果没有volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器失去大量优化的机会。
5、BigDecimal使用误区
BigDecimal的加减乘除方法都是有返回值的,这个返回值就是计算的结果,所以必须用一个引用来接收返回值,仅仅调用 加add()、减subtract()、乘multiple()、除divide() 是不会将计算结果放入调用者的对象中的。必须接收返回值。
6、子类反射获取父类的属性
Class类有一个方法getSuperclass(),我们通过此方法,递归向上寻找属性,代码如下:
1 public Field getSuperField(Class<?> classes, String fieldName) { 2 Field field = null ; 3 while(! classes.equals(Object.class)) { 4 try { 5 field = classes.getDeclaredField(fieldName) ; 6 } catch (NoSuchFieldException e) { 7 //忽略在当前类中找不到该属性的异常 8 } 9 //向上寻找父类,直到Object.cass为止 10 classes = classes.getSuperclass() ; 11 } 12 return field ; 13 }