1. 接口参数进行验证
public void test(String s){ if(s == null){ throw new NullPointerException(); } }
2. 保护性拷贝
避免因为测试外参数变更对方法造成影响:如下
Date start = new Date(2014, 2, 2); Date end = new Date(2014, 3, 1); test(start, end); end.setMonth(1);可以这样来实现方法解决这个问题:
public void test(Date start, Date end){ Date s = new Date(start.getTime()); Date e = new Date(end.getTime()); }
以及对get方法中的返回值使用clone或者new新对象等
3. 返回空的数组或者集合而不是null
4. 局部变量作用于最小化
防止拷贝错误,更好的垃圾回收
List<String> list = new ArrayList<String>(); // 用for代替下面的while for (Iterator<String> i = list.iterator(); i.hasNext();) { } Iterator<String> i1 = list.iterator(); while(i1.hasNext()){ }5. 尽量使用基本类型,只有在作为key,或者是必须用封装类型的地方采用
Integer i = null; Integer i2 = new Integer(1); Integer i3 = new Integer(1); System.out.println(i2 == i3); System.out.println(i == 0);出了性能上的损耗外,上面的代码还容易造成错误。
6. 对于可恢复的情况适用受检异常,对于编程错误适用运行时异常
7. 可以适用it.hasNext()这样的状态检测方式或者是返回状态码的方式来减少运行时异常
8. 一些常用的标准异常
IllegalArgumentException 参数不合适的异常
IllegalStateException 调用方法是对象的状态不正确,比如没有这个对象没有初始化
NullPointerException
IndexOutOfBoundsException
UnsupportedOperationException 对象不支持用户请求的方法
ArithmeticException 数学计算的时候出现错误,比如除0了
NumberFormatException 数字格式错误
9. 序列化要加上UID,并且记得在需要的时候修改它,如果不加的话JVM会根据类信息自动算出UID,有可能在很小的变动之后就造成接口不兼容。
10. 序列化有可能被攻击,比如别人直接生成了一个二进制文件,然后被读入就可以进行攻击。为了防止这种攻击,可以使用readObject方法,进行简单的参数验证