Java空指针预防

  1. equals方法把确定不是null的作为对象调用,尽量当参数而不是对象使用
    String s = null;
    String m = "s";
    //true
    m.equals(s);
    //false
    s.equals(m);
    
  2. 在两者返回相同结果的时候偏向使用valueOf()而非toString()
    double price = getPrice(); 
    System.out.println(Double.valueOf(price)); //doesn’t throw NPE 
    System.out.println(price.toString()); //throws “Exception in thread “main” 
    //java.lang.NullPointerException
    
  3. 使用空安全方法(null safe method)或者类库(空参数不报异常)
    System.out.println(StringUtils.isEmpty(null)); 
    System.out.println(StringUtils.isBlank(null)); 
    System.out.println(StringUtils.isNumeric(null)); 
    System.out.println(StringUtils.isAllUpperCase(null));
    
    Output: 
    true 
    true 
    false 
    false
    
    
  4. 避免用返回空的collection或者空的array来代替从方法中返回
    通过返回一个空的collection或者一个空的array可以确定像size(),length()
    这种基础的调用不会抛出NullPointException。
    Collection类能够提供方便的空的List,Set和Map,(这些)有Collections.EMPTY_LIST,
    Collections.EMPTY_SET和 Collections.EMPTY_MAP这些能够被使
    原本空的集合用这些静态变量的方式预防空指针
    
    
    
    public List getOrders(Customer customer){
    	List result = Collections.EMPTY_LIST;
    	return result;
    }
    
    
    

    注意:使用Collections.emptyList()生成的List不支持add方法

  5. 使用@NotNull和@Nullable注释
     当写你可以定义关于约定可空性(Nullability),要通过使用像@NotNull和@Nullable类似的注释
     提示这个方法
     是否为空安全(null safe)。
     现代的编译器,IDE和其他工具可以读出这个注释来帮你做一个空检查或者告诉你是否需要空检查。
     IntelliJ IDE和findbugs 已经支持这种注释。
     这些注释也是JSR 305(译者注:可以理解为java的标准)的一部分。
     通过看到@NotNull和@Nullable,程序猿可以自己决定是否去进行空检查。
     顺便说下,对于JAVA程序猿来说,这是新的实践,尽管需要一点时间去适应。
    
  6. 遵循约定和定义合理的默认值
    在java领域,一个最佳的避免空指针的方法之一就是和定下约定和遵守约定。
    大部分的NullPointException发生原因就是使用了一个不完整的信息或
    者并没有被提供所有的依赖信息来创建象。
    如果你不允许创建不完整的对象和否定任何这种要求,
    你可以预防很多一段时间之后发生的NullPointException。如果对象被允许创建,那么你应该设定合理的默认值。
    例如,一个Employee(雇员)对象不可以在没有Id和Name属性的情况下被创建,
    但可以有一个可供选择的pghone number(电话号码)。如果Employee没有phone number,
    那么就用返回一个0来代替返回一个空值。
    但是这种处理必须非常小心地处理对空值的检查而不是检查非法输入。
    同样要注意,定义可以使空值的或者不可以空值的时候,提醒调用者作出被告知的决定。
    失败之后的选择或者接受空值也是一个你需要重视的重要设计。
    
  7. 数据库对空值的约束
    如果你使用数据库去存储你的域对象(demain object),例如:Customer、Orders等等,
    那么你应该定义一些在数据库对空值的约束。因为数据库可以要求获得从多个来源来的数据,
    在数据库中拥有对空值的检查将会确保数据的完整性。
    在数据库中保留对空值约束的约束也是会让你减少在JAVA中减少空检查的代码。
    当从数据库中取出一个对象是,你可以确保那些属性可以是空而那些属性不可以使空,
    这将会让那些空检查的代码最小化。
    
  8. 使用空对象模式(new Obj())
    这是另外一个在JAVA里面避免NullPointException的方法。如果一个方法返回一个对象,调用者要遍历这个对象,
    就要使用一些类似Collection.iterator()的方法去返回iterator。
    如果调用者没有任何的上述的这些方法,那他需要返回的是空对象而不是空(null)。
    空对象是一个特别的对象,它在不同的上下文中有不同的含义。
    像这些返回Contrainter或者Conllection类型的方法的情况中,
    里面为空的对象(Empty object)应该被使用而不是返回空。
    

猜你喜欢

转载自blog.csdn.net/qq_40354317/article/details/82805516