前几天就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泛型通配符T,E,K,V区别,T以及Class<T>,Class<?>的区别

    1. 先解释下泛型概念 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛 ...

  2. Flsak中的socket是基于werkzeug实现的。

    from werkzeug.serving import run_simple from werkzeug.wrappers import Request,Respinse @Request.appl ...

  3. Flask之路由相关

    1.装饰器中的参数 @app.route("/info", methods=["GET", "POST"]) def student_inf ...

  4. hdu 4717: The Moving Points 【三分】

    题目链接 第一次写三分 三分的基本模板 int SanFen(int l,int r) //找凸点 { ) { //mid为中点,midmid为四等分点 ; ; if( f(mid) > f(m ...

  5. 对webpack的初步研究3

    Output配置output配置选项告诉webpack如何将编译后的文件写入磁盘.请注意,虽然可以有多个entry点,但只output指定了一个配置. A filename to use for th ...

  6. Task9.Attention

    注意力模型最近几年在深度学习各个领域被广泛使用,无论是图像处理.语音识别还是自然语言处理的各种不同类型的任务中,都很容易遇到注意力模型的身影.所以,了解注意力机制的工作原理对于关注深度学习技术发展的技 ...

  7. JS自定义 Map

    <script>function HashMap(){this.map = {};}HashMap.prototype = { put : function(key, value){ th ...

  8. IDEA git 合并多个commit

    当前三个commit,demo1,demo2,demo3 选择demo1右键 选择action 跟着指示操作,最后合并 时间线: Log 框时间线:是从上到下,越来越早. 弹出框时间线:是从上到下,越 ...

  9. 使用Windows service创建一个简单的定时器

    一.需求 我们有时候可能会想要做一些定时任务,例如每隔一段时间去访问某个网站,或者下载一些东西到我们服务器上等等之类的事情,这时候windows service 是一个不错的选择. 二.实现 1.打开 ...

  10. java中super的用法总结

    package com.ssm.java; /** * Super * usage1:super. 直接去调用父类的方法和属性. * usage2:放在构造器中的第一位,代表引用父类的构造器. */ ...