Java 小技巧和在Java避免NullPonintException的最佳方法(翻译)

            前几天就g+里面看到有人引用这篇博文。看了一下。受益颇多。

所以翻译过来,希望和大家一起学习。本人英语水平有限,假设有错,请大家指正。

原文地址(须要FQ):http://javarevisited.blogspot.com/2013/05/ava-tips-and-best-practices-to-avoid-nullpointerexception-program-application.html

=============================切割线==================================

Java 小技巧和在java应用避免NullPonintException的最佳方法

在java应用程序中,一个NullPonintException(空指针异常)是最好解决(问题)的方法。同一时候,空指针也是写健壮的顺畅执行的代码的关键。“预防好过治疗”这句话也相同适用于令人不爽的NullPonintException。

通过应用防御性的编码技术和在遵守多个部分之间的约定,你能够再非常大程度上避免NullPointException。以下的这些java小技巧能够最小化像!=null这样的检查的代码。作为经验丰富的java程序员,你可能意识到这些技术的某部分项目其中使用它。可是对于大学一年级学生和中级开发人员,这是一个非常好的学习机会。

 

这是一些非常easy学会的简单技术,可是对于代码质量和健壮性来说确实非常重要。

以我的经验,仅是第一个小技巧就已经对改进代码质量具有非常大的作用了。

1)在已经的String(字符串)调用 equal()和 equalsingnoreCase()而不是未知的对象

通常在已经的非空字符串在调用equals()。由于equal()方法是对称的。调用a.equal()是同等于调用b.equal()。和这就是为什么非常多部注意对象a和b,假设空的一边被调用会到导致空指针。

 

Object unknownObject = null;

//wrong way - may cause NullPointerException
if(unknownObject.equals("knownObject")){
   System.err.println("This may result in NullPointerException if unknownObject is null");
}

//right way - avoid NullPointerException even if unknownObject is null
if("knownObject".equals(unknownObject)){
    System.err.println("better coding avoided NullPointerException");
}


这是最重要的避免NullPointException的java技巧,可是结果会是极大的改进。由于equal()是一个非常普遍的方法。


2)在两者返回相同结果的时候偏向使用valueOf()而非toString()

由于空对象调用toString()时会抛出NullPointException。假设我们能够通过调用value()得到相同的值的话。就应该使用valueOf()。这样会传递会一个空值。特别是在像Integer,Float,Double或者BigDecimla之类的包装类的情况下。


BigDecimal bd = getPrice();
System.out.println(String.valueOf(bd)); //doesn’t throw NPE
System.out.println(bd.toString()); //throws "Exception in thread "main" java.lang.NullPointerException"


假设你不确定你所使用的对象是否是空的时候,请使用这个JAVA技巧

 

3)使用空安全方法(null safe method)或者类库

如今有非常多已经为你做了null检查的开源组件出现。其中一个最为普遍的就是Apache的StringUtils。你能够使用StringUtils.isBlank(),isNumberic(),isWhiteSpace()和其它工具一些不用操心NullPointException方法。


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

但在作出不论什么结论之前,不要忘记阅读关于Null安全方法和类的文档。这是还有一个java最佳操练。这不会要求你付出非常多的努力,但会让你获得非常大的进步。

 

4)避免用返回空的collection或者空的array来取代从方法中返回Null

这个java技巧也是在Joshua Bloch的《Effective Java》所提及的。

这本书也是一个提高JAVA编码能力的一个来源。通过返回一个空的collection或者一个空的array能够确定像size()length()这样的基础的调用不会抛出NullPointExceptionCollection类能够提供方便的空的ListSetMap,(这些)Collections.EMPTY_LIST, Collections.EMPTY_SET Collections.EMPTY_MAP这些能够被使用的(静态变量)。

代码例如以下;

public List getOrders(Customer customer){
   List result = Collections.EMPTY_LIST;
   return result;
}

相似地你能够使用Collections.EMPTY_LIST, Collections.EMPTY_SET Collections.EMPTY_MAP来取代返回Null

 

5)使用@NotNull和@Nullable凝视

当写你能够定义关于约定可空性(Nullability)。要通过使用像@NotNull和@Nullable相似的凝视提示这种方法是否为空安全(null safe)。现代的编译器,IDE和其它工具能够读出这个凝视来帮你做一个空检查或者告诉你是否须要空检查。IntelliJIDE和findbugs 已经支持这样的凝视。这些凝视也是JSR 305(译者注:能够理解为java的标准)的一部分。通过看到@NotNull和@Nullable,程序员能够自己决定是否去进行空检查。顺便说下,对于JAVA程序员来说,这是新的最好的实践。虽然须要一点时间去适应。

 

7)遵循约定和定义合理的默认值

在java领域。一个最佳的避免空指针的方法之中的一个就是和定下约定和遵守约定。大部分的NullPointException发生原因就是使用了一个不完整的信息或者并没有被提供所有的依赖信息来创建对象。

假设你不同意创建不完整的对象和否定不论什么这样的要求。你能够预防非常多一段时间之后发生的NullPointException。假设对象被同意创建,那么你应该设定合理的默认值。

比如,一个Employee(雇员)对象不能够在没有Id和Name属性的情况下被创建,但能够有一个可供选择的pghone number(电话号码)。假设Employee没有phone number。那么就用返回一个0来取代返回一个空值。可是这样的处理必须非常小心地处理对空值的检查而不是检查非法输入。

相同要注意。定义能够使空值的或者不能够空值的时候。提醒调用者作出被告知的决定。失败之后的选择或者接受空值也是一个你须要重视的重要设计。

 

8)假设你使用数据库去存储你的域对象(demain object)。比如:Customer、Orders等等,那么你应该定义一些在数据库对空值的约束。由于数据库能够要求获得从多个来源来的数据,在数据库中拥有对空值的检查将会确保数据的完整性。在数据库中保留对空值约束的约束也是会让你降低在JAVA中降低空检查的代码。当从数据库中取出一个对象是。你能够确保那些属性能够是空而那些属性不能够使空,这将会让那些空检查的代码最小化。

 

9)使用空对象模式

这是另外一个在JAVA里面避免NullPointException的方法。

假设一个方法返回一个对象,哪个调用者要遍历这个对象。哪个调用者就要使用一些相似Collection.iterator()的方法去返回iterator。

假设调用者没有不论什么的上述的这些方法,那么有可能返回的是空对象而不是空(null)。空对象是一个特别的对象,它在不同的上下文中有不同的含义。

像这些返回Contrainter或者Conllection类型的方法的情况中,里面为空的对象(Empty object)应该被使用而不是返回空。


这就是文章的所有了。

这就是easy实现的java技巧和避免NullPointException的实操。你会领会到这些技巧是多么的有用而又不用非常多的操作。






posted @ 2019-05-25 08:13  ldxsuanfa  阅读(295)  评论(0编辑  收藏  举报