Java 小技巧和在Java避免NullPonintException的最佳方法(翻译)
前几天就g+里面看到有人引用这篇博文。看了一下。受益颇多。
所以翻译过来,希望和大家一起学习。本人英语水平有限,假设有错,请大家指正。
=============================切割线==================================
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的最佳方法(翻译)的更多相关文章
- SpringBoot小技巧:修改java可执行jar包内容
SpringBoot小技巧:修改java可执行jar包内容 情景描述 在生产环境中,有时候我们发现了个小bug,开发迅速修改代码后,很多时候我们不得不重新发布一个新的可执行jar包上去替换掉.但是这样 ...
- Java小技巧输出26个英文字母
相信有的童鞋写到过与字母有关的小东西,是否有写过全部的字母呢?26个这么多字母,一个个打会疯掉.所有咱们可以用一个小技巧使用for循环帮我们把26个字母自动搞出来,大家来瞅一眼把! 使用Java遍历2 ...
- java小技巧
String 转 Date String classCode = RequestHandler.getString(request, "classCode"); SimpleDat ...
- 【java小工具】从.java文件中筛选出方法,并计算出方法在这些文件中出现的次数
package getMethod; import java.io.*; import java.util.*; import java.util.regex.Matcher; import java ...
- C#中??和?分别是什么意思? 在ASP.NET开发中一些单词的标准缩写 C#SESSION丢失问题的解决办法 在C#中INTERFACE与ABSTRACT CLASS的区别 SQL命令语句小技巧 JQUERY判断CHECKBOX是否选中三种方法 JS中!=、==、!==、===的用法和区别 在对象比较中,对象相等和对象一致分别指的是什么?
C#中??和?分别是什么意思? 在C#中??和?分别是什么意思? 1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; ...
- 小技巧:selenium java中如何使用chrome默认的profile
使用浏览器默认的profile可以在一定程度上实现免登录的效果,另外默认的profile中很多文件都被缓存了,也有利于加快测试的速度 System.setProperty("webdrive ...
- java小技巧-生成重复的字符
今天碰到个需求,根据字段个数,动态生成sql的占位符,如下: public static void main(String[] args) { System.out.println(String.jo ...
- java小技巧:如何分批次导入大量数据
//List 需要导入的数据int count = 1000;//每批次导入的数目int Lastindex = count;List<List<T>> shareList = ...
- Java小技巧:怎么循环日期?
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");try{//起始日期Date start = sdf.parse ...
随机推荐
- Python not and or
刷题时候,有道题目的答案是 return(num and (num % 9 or 9)) 看的有点懵逼,看来解释如下: 1.首先,’and’.’or’.’not’的优先级是not>and> ...
- stream benchmark 介绍
英文原版 https://www.cs.virginia.edu/stream/ref.html FAQ中有关于STREAM_ARRAY_SIZE NTIME OFFSET STREAM_TYPE的设 ...
- Wannafly挑战赛27 D绿魔法师
链接Wannafly挑战赛27 D绿魔法师 一个空的可重集合\(S\),\(n\)次操作,每次操作给出\(x,k,p\),要求支持下列操作: 1.在\(S\)中加入\(x\). 2.求\[\sum_{ ...
- python的次方操作
好简单,不需要import任何包 b=a**n就是求a的n次方,如果n=0.5就是开方 如果开方的是负数或者附复数,需要 import math b=math.sqrt(a) 这样
- robot framework 自动化框架环境搭建
win10 64位系统 1.安装python2.7.15 在官网https://www.python.org/downloads/下载对应版本 在同一台电脑上同时安装Python2和Python3参考 ...
- python 日期封装
import time import datetime import locale class TimeUtil: def __init__(self, curtime=None): self.cur ...
- CoreData新增字段
1. 在模型文件的Entity里面增加字段名 2. Xcode工具栏选择Edtor->Creat NSManagerObject SubClass->...->生成新的关联文件 3. ...
- web页面上传大文件有没有好的解决方案
本人在2010年时使用swfupload为核心进行文件的批量上传的解决方案.见文章:WEB版一次选择多个文件进行批量上传(swfupload)的解决方案. 本人在2013年时使用plupload为核心 ...
- 带有lazy标记的线段树
#include<bits/stdc++.h> using namespace std; ]; struct st{ int l,r,val,add; }tr[]; void build( ...
- P2627 修剪草坪 (单调队列优化$dp$)
题目链接 Solution 70分很简单的DP,复杂度 O(NK). 方程如下: \[f[i][1]=max(f[j][0]+sum[i]-sum[j])\]\[f[i][0]=max(f[i-1][ ...