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

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

原文地址(须要翻墙):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()这样的基础的调用不会抛出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.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的实操。你会领会到这些技巧是多么的有用而又不用非常多的操作。

Java 小技巧和在Java避免NullPonintException的最佳方法(翻译)的更多相关文章

  1. SpringBoot小技巧:修改java可执行jar包内容

    SpringBoot小技巧:修改java可执行jar包内容 情景描述 在生产环境中,有时候我们发现了个小bug,开发迅速修改代码后,很多时候我们不得不重新发布一个新的可执行jar包上去替换掉.但是这样 ...

  2. Java小技巧输出26个英文字母

    相信有的童鞋写到过与字母有关的小东西,是否有写过全部的字母呢?26个这么多字母,一个个打会疯掉.所有咱们可以用一个小技巧使用for循环帮我们把26个字母自动搞出来,大家来瞅一眼把! 使用Java遍历2 ...

  3. java小技巧

    String 转 Date String classCode = RequestHandler.getString(request, "classCode"); SimpleDat ...

  4. 【java小工具】从.java文件中筛选出方法,并计算出方法在这些文件中出现的次数

    package getMethod; import java.io.*; import java.util.*; import java.util.regex.Matcher; import java ...

  5. C#中??和?分别是什么意思? 在ASP.NET开发中一些单词的标准缩写 C#SESSION丢失问题的解决办法 在C#中INTERFACE与ABSTRACT CLASS的区别 SQL命令语句小技巧 JQUERY判断CHECKBOX是否选中三种方法 JS中!=、==、!==、===的用法和区别 在对象比较中,对象相等和对象一致分别指的是什么?

    C#中??和?分别是什么意思? 在C#中??和?分别是什么意思? 1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; ...

  6. 小技巧:selenium java中如何使用chrome默认的profile

    使用浏览器默认的profile可以在一定程度上实现免登录的效果,另外默认的profile中很多文件都被缓存了,也有利于加快测试的速度 System.setProperty("webdrive ...

  7. java小技巧-生成重复的字符

    今天碰到个需求,根据字段个数,动态生成sql的占位符,如下: public static void main(String[] args) { System.out.println(String.jo ...

  8. java小技巧:如何分批次导入大量数据

    //List 需要导入的数据int count = 1000;//每批次导入的数目int Lastindex = count;List<List<T>> shareList = ...

  9. Java小技巧:怎么循环日期?

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");try{//起始日期Date start = sdf.parse ...

随机推荐

  1. java四种引用类型以及使用场景详解

    每种编程语言都有自己操作内存中元素的方式,例如在 C 和 C++ 里是通过指针,而在 Java 中则是通过“引用”.在 Java 中一切都被视为了对象,但是我们操作的标识符实际上是对象的一个引用(re ...

  2. nbench

    http://www.math.utah.edu/~mayer/linux/bmark.html nbench-byte-2.2.3  --> http://www.math.utah.edu/ ...

  3. solr的一些查询语法

    以下内容来自solr中国 1.1. 首先假设我的数据里fields有:name, tel, address 预设的搜寻是name这个字段, 如果要搜寻的数据刚好就是 name 这个字段,就不需要指定搜 ...

  4. 一次Oday提权批量拿取商城服务器root权限

    此问题影响范围巨大,涉及到所有通过niushop开发的商城,希望通过这篇文章能够引起大家的重视.(注:演示的所用商城已经修复了此漏洞) 严重性:特级 解决方案:1.在用户访问漏洞页时对其身份进行判断: ...

  5. springCloud 服务提供者应返回的统一的数据格式

    package com.zledu.commonentity.entity; import lombok.AllArgsConstructor;import lombok.Data; import j ...

  6. 【leetcode】1093. Statistics from a Large Sample

    题目如下: We sampled integers between 0 and 255, and stored the results in an array count:  count[k] is ...

  7. Java缓冲字符读取

    public class BufferedReaderDemo { public static void main(String[] args) throws IOException { // 创建流 ...

  8. 01-跨域-jsonp原理

    jsonp能跨域,并不是因为它发送了ajax请求,而是利用动态创建的script标签. script标签没有收到浏览器同源策略的限制,是可以跨域访问的. 创建的script标签,把其src指向请求的服 ...

  9. iText导出PDF(图片,水印,页眉,页脚)

    项目需要导出PDF,导出的内容包含图片和文本,而且图片的数量不确定,在网上百度发现大家都在用iText,在官网发现可以把html转换为PDF,但是需要收费,那就只能自己写了. 在开始之前先在网上百度了 ...

  10. Spring动态数据源-AbstractRoutingDataSource

    在分库分表的情况下,在执行SQL时选择连接不同的数据源(库)的思路:配置多个数据源加到动态数据源对象中,根据实际的情况动态切换到相应的数据源中. 如存放订单信息的有10个库,每个库中有100张表,根据 ...