看了不后悔的java编程习惯

来源:互联网 发布:unity3d 软体材质 编辑:程序博客网 时间:2024/05/17 02:41

1、恰当的异常处理(注意避免NullPointException,null值和数组越界等问题)

NullPointException

NullPointException是java编程中导致闪退的大明星,出现NullPointException的大部分原因是编写程序的过程中对一个变量的值得把握不准,程序员本以为已经对某个变量赋值了,就直接去使用它,但是很多情况下,都是赋了null值,然后去使用,我们无法避免赋null值,因为运行时有很多值我们无法把控,但是要多赋null值进行容错处理,也就是在使用之前判断该变量是否为null。那关键的问题就转移到了我们如何知道正在使用的变量会不会为null,因为程序员已经赋值了,正确的思路就是:(1)有避免使用null值的意识,在使用一个变量之前认真检查一下你的这儿变量是否会出现null的情况;(2)了解null值可能出现的场景;(3)只要有可能出现使用前为null,那就要对这个变量进行一个判断null值得if语句去避免使用null值。下面就第(2)进行我个人的一个总结说明,如果其他博友有补充的,欢迎指正,大家一同进步。

可能出现null的情形:

(1)未初始化就调用(这个最容易发现)

(2)数据从外部(网络,文件,数据库)获取时,不判断就直接使用

(3)引入外部包出现NullPointerException,
随着各种框架的发展而越来越常见,当代的程序员越来越懒。主要是人们盲目引用各种包,而不去详细评估引用包的效果,及不去了解所引入包的依赖包。

(4)异常处理不当导致的null值

在这里列举一个例子:处理IO异常时可能出现的不恰当的异常处理,直接贴上两段源代码,一目了然

不恰当的处理:

       FileReader reader = null;        try {            reader = new FileReader("a.txt");            int readByte = 0;            while ((readByte = reader.read()) != -1) {                System.out.print((char) readByte);            }        } catch (FileNotFoundException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } finally {            try {                    reader.close();            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }
恰当的处理:

       FileReader reader = null;        try {            reader = new FileReader("a.txt");            int readByte = 0;            while ((readByte = reader.read()) != -1) {                System.out.print((char) readByte);            }        } catch (FileNotFoundException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } finally {            try {                if (reader != null) {//关键性的区别所在                    reader.close();                }            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }

(5)注意一点,千万不要使用

try{     ...}catch(NullPointException e){      ...}

去捕获异常,因为一旦出现这个异常,捕捉不了日志,不利于从根源解决问题,而且很难查出来bug所在。

常见的NullPointException例子和解决方法

(1)List list = 通过后台数据库返回List信息 为null接收后习惯性for循环遍历 

for(int i=0;i<list.size();i++){}
报错,出现NullPointerException异常;

避免方法:在遍历list之前一般都会加上

If(list!=null&&list.size()>0){...}

两个条件前后不能调换,因为程序是优先从左边开始执行的。

(2)S s= reqeust.getAttribute("s");//s为null

然后直接输出S.toString();又或是调用其方法或者属性。报错,出现NullPointerException异常;

解决方法:首先判断对象是否为空,如果为空初始化其实力对象;
(3)在比对String的时候:

str.equals("test")

 当str值为Null时报错,出现NullPointerException异常;
避免方法:一律习惯的写成"test".equals(str);

(4)函数尽量不要返回null,而是反悔一个空的对象:

Collections辅助类中有静态的EMPTY_LIST EMPTY_SET EMPTY_MAP,可以方便的使用它们

public List<Integer> f() {    try {        // ...        return result;    } catch (SomeException e) {        e.printStackTrace();        return Collections.EMPTY_LIST;    }}



数组长度的问题(长度为0时尤其注意)

File path = new File(...);String [] paths = path.list();if(paths.length==0){...}else{...}
对于不同长度的paths数组,需要做不同的处理,否则有可能造成不必要的消耗内存的操作

2、释放资源的习惯

(持续总结中...)

3、

4、不要把不相关的事物耦合在一起

“单一职责”这点很关键,不需要耦合在一起的东西就不要耦合在一起。

0 0