关于Java空指针的控制(转)
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方法。
但在作出任何结论之前,不要忘记阅读关于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)应该被使用而不是返回空。
关于Java空指针的控制(转)的更多相关文章
- Java的流程控制和C++的异同
Java的流程控制和C++基本相似 现将不同的地方总结一下,以便快速掌握. Java的特殊流程控制的特殊部分: 1.顺序结构 -- 没有区别 2.分之结构 -- 没有区别 3.循环结构 1> ...
- 采用truelicense进行Java规划license控制 扩展可以验证后,license 开始结束日期,验证绑定一个给定的mac住址
采用truelicense进行Java规划license控制 扩展可以验证后,license 开始结束日期,验证绑定一个给定的mac住址. Truelicense 它是一个开源java license ...
- 使用XML布局文件和Java代码混合控制UI界面
完全使用Java代码来控制UI界面不仅烦琐.而且不利于解耦:而完全利用XML布局文件来控制UI界面虽然方便.便捷,但难免有失灵活.因此有些时候,可能需要混合使用XML布局文件和代码来控制UI界面. 当 ...
- 论Java访问权限控制的重要性
人在什么面前最容易失去抵抗力? 美色,算是一个,比如说西施的贡献薄就是忍辱负重.以身报国.助越灭吴:金钱,算是另外一个,我们古人常说“钱乃身外之物,生不带来死不带去”,但我们又都知道“有钱能使鬼推磨” ...
- java zookeeper权限控制ACL(digest,IP)
java zookeeper权限控制ACL(auth,digest,ip) 学习前请参考:https://www.cnblogs.com/zwcry/p/10407806.html zookeeper ...
- Java:谈谈控制线程的几种办法
目录 Java:谈谈控制线程的几种办法 join() sleep() 守护线程 主要方法 需要注意 优先级 弃用三兄弟 stop() resume suspend 中断三兄弟 interrupt() ...
- Java学习--流程控制
Java学习 流程控制 用户交互Scanner Scanner对象 Java通过Scanner类获取用户的输入 基本语法: Scanner scanner = new Scanner(System.i ...
- [THINKING IN JAVA]访问权限控制
6 访问权限控制 6.1 包:库单元 package.import.import *.import static: 修改classpath环境变量可以将自己写的类库添加至环境变量并在任何java程序中 ...
- Java学习笔记:控制反转
控制反转(Ioc)模式(又称DI:Dependency Injection)就是Inversion of Control,控制反转.在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在 ...
随机推荐
- 负载均衡 Lvs DR 模式笔记
先来一张原理图,相当于ip-tun模式把tunl0的那块网卡配置在eth0:0的这个接口上,避免了兼容性的问题
- loading.io一个loading图标网站,跟大家分享
loading.io是官方网址在首页选一款loading图标,看到左上角的 Try it now中有选中的图标后,可通过光标滑动选择图标大小,然后再点右边的get svg或get css等下载即可
- Pomelo聊天室框架
聊天室是验证服务器最典型的例子,Pomelo的运行架构: 在这个架构里,前端服务器也就是connector专门负责承载连接, 后端的聊天服务器则是处理具体逻辑的地方. 这样扩展的运行架构具有如下优势: ...
- jackson - 生成jason工具-简单示例
主页: http://jackson.codehaus.org/ https://github.com/FasterXML/jackson 当前jackson分为三部分,需要分别下载: jackson ...
- 使用AIR进行移动APP开发常见功能和问题(下)
1. Air如何判断android.ios 平台网络连接状态? Android,使用as3原生api: if(NetworkInfo.isSupported)//只有android支持 Networ ...
- Java的IO操作中有面向字节(Byte)和面向字符(Character)两种方式
解析:Java的IO操作中有面向字节(Byte)和面向字符(Character)两种方式.面向字节的操作为以8位为单位对二进制的数据进行操作,对数据不进行转换,这些类都是InputStream和Out ...
- puppet来管理文件和软件包
puppet来管理文件和软件包 1 exec的使用,可以运行shell命令 为配置文件添加配置,指示写了关键部分,其他配置省略没写 代码示例如下: [root@pup manifests]# cat ...
- 对于python的__name__="__main__"的含义的理解
学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = '__main ...
- 史上最全的synchronized解释
首先:推荐使用synchronized(obj)这种方法体的使用方式,一个类里面建议尽量使用单一的同步方法,多种方法混用,维护成本太大. 其次:关于java5.0新增的ReenTrantLock方法: ...
- 基于机器学习的web异常检测
基于机器学习的web异常检测 Web防火墙是信息安全的第一道防线.随着网络技术的快速更新,新的黑客技术也层出不穷,为传统规则防火墙带来了挑战.传统web入侵检测技术通过维护规则集对入侵访问进行拦截.一 ...